如何使用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
答案 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示例相同。