awk无法将时间与定义的值进行比较

时间:2014-09-23 17:20:56

标签: bash awk

如何使用awk比较时间。我一直在尝试使用以下方法,但失败了。

下面的文件中的第4列应该在" Lag"超过了价值" 24:00:00"。但在我的情况下只有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

2 个答案:

答案 0 :(得分:5)

字符串2712:22:54大于字符串24:00:00,因为每个(2)的第一个字符是相同的,但是当你到达第二个字符7时大于4且所有其他字符串都小于字符串24:00:00,因为它们都以1开头。也许你想用0024:00:00作为门槛?或者,将所有字符串转换为整数(例如,通过secs = hours * 60 * 60 + mins * 60)以进行数字比较。

答案 1 :(得分: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示例相同。