2014-09-23 30 views
1

如何使用awk比較時間。我一直在嘗試使用下面的方法,但失敗。awk無法與定義值進行比較

只要「延遲」超過值「24:00:00」,就應打印下面文件中的第4列。但在我的情況下,只有2717:33:54正在印刷。所有行應該打印的地方。

bash-4.2$ cat test 
Source Destination  State   Lag    Status 
Data1 Test:/data1  Complted  1239:30:37  Quiescing 
Data2 Test:/data2  Complted  1239:30:13  Idle 
Data3 Test:/data3  Complted  1208:37:21  Idle 
Data4 Test:/data4  Complted  1208:36:46  Idle 
Data5 Test:/data5  Complted  1239:29:41  Idle 
Data6 Test:/data6  Complted  1239:29:26  Idle 
Data7 Test:/data7  Complted  1239:28:52  Idle 
Data8 Test:/data8  Complted  2717:33:54  Quiescing 

threhold=24:00:00 

cat test | awk -v threshold=$threshold '$4 > threshold' 
Source Destination  State   Lag    Status 
Data8 Test:/data8  Complted  2717:33:54  Quiescing 
+1

@jaypal在代碼段中存在變量名的錯字。分配線上的'threhold'。這改變了我輸出的結果,當我糾正它的時候。這就是說,我不知道awk如何比較這些領域。我很想猜。推測是字符串長度,然後是位置字符值。它不會做的**是按照時間計算它們。 – 2014-09-23 17:50:15

+0

@EtanReisner啊,我只是複製粘貼。 – 2014-09-23 17:53:46

+0

'awk'不是特別適合使用日期/時間結構 - 它將字段​​視爲字符串,而不是您理解它們的區間;因此,它正在進行詞典(即字典順序)比較。您可能想要嘗試使用'python'或'perl'來獲得更好的日期/時間處理功能。 – twalberg 2014-09-23 17:58:35

回答

0

正如其他人所說,比較24:00:00和1239:30:37不會做你想做的事情,因爲比較是詞典(即按字母順序逐個比較字符)。一種選擇是在數秒內完成工作,然後進行數字比較。這裏是你如何能做到這一點使用Perl的一個班輪:

perl -slane 'sub tt{($h,$m,$s)=split /:/,shift; return $h*3600+$m*60+$s} 
      print if tt($F[3])>tt($t)' -- -t="$threshold" file 

tt拆分它是在傳遞的字符串子程序「:」。給定格式爲「小時:分鐘:秒」的輸入,它返回總秒數。 -a啓用自動關閉模式,這意味着每行輸入的第4列存儲在$F[3]中。以秒爲單位的列值與在行尾傳遞的參數值進行比較。打印滯後大於$t的行。

測試出來:

$ perl -slane 'sub tt{($h,$m,$s)=split /:/,shift; return $h*3600+$m*60+$s} print if tt($F[3])>tt($t)' -- -t=24:00:00 file 
Data1 Test:/data1  Complted  1239:30:37  Quiescing 
Data2 Test:/data2  Complted  1239:30:13  Idle 
Data3 Test:/data3  Complted  1208:37:21  Idle 
Data4 Test:/data4  Complted  1208:36:46  Idle 
Data5 Test:/data5  Complted  1239:29:41  Idle 
Data6 Test:/data6  Complted  1239:29:26  Idle 
Data7 Test:/data7  Complted  1239:28:52  Idle 
Data8 Test:/data8  Complted  2717:33:54  Quiescing 

當你標記AWK的問題,這裏是你能怎麼用awk,而不是做同樣的事情:

awk 'function tt(t){split(t,a,/:/); return a[1]*3600+a[2]*60+a[3]} 
    tt($4)>tt(t)' t="$threshold" file 

的邏輯是一樣的,在上面的Perl例子。

+1

謝謝Tom,perl和awk都能正常工作。 – 2014-09-24 11:14:43

5

字符串2712:22:54比字符串24:00:00更大,因爲每個的第一個字符(2)是相同的,但那麼當你到了第二個字符74更大和所有其他字符串都小於字符串24:00:00,因爲它們全部以1開頭。也許你想使用作爲閾值?或者將所有字符串轉換爲整數(例如,通過secs = hours * 60 * 60 + mins * 60)以獲得數字比較。