我试图跳过对 End_time 值为“失败”的列行的操作。
这是我的实际文件。
检查时间.log
Done City Start_time End_time
Yes Chicago 18 10
Yes Atlanta 208 11
No Minnetonka 57 Failed
Yes Hopkins 112 80
No Marietta 2018 Failed
这是我目前所拥有的。
awk 'BEGIN { OFS = "\t" } NR == 1 { $5 = "Time_diff" } NR >= 2 { $5 = $3 - $4 } 1' < files |column -t
输出:
Done City Start_time End_time Time_diff
Yes Chicago 18 10 8
Yes Atlanta 208 11 197
No Minnetonka 57 Failed 57
Yes Hopkins 112 80 32
No Marietta 2018 Failed 2018
期望的输出应该是这样的:
Done City Start_time End_time Time_diff
Yes Chicago 18 10 8
Yes Atlanta 208 11 197
No Minnetonka 57 Failed
Yes Hopkins 112 80 32
No Marietta 2018 Failed
那么我该如何跳过呢?
最佳答案
你应该能够改变:
$5 = $4 - $5
进入:
if ($4 != "Failed") { $5 = $3 - $4 }
这将:
- 拒绝在结束时间为
失败
的行中将$5
从空更改为计算值;和 - 正确计算所有其他行。
我说正确,因为在这些情况下您似乎希望开始时间减去结束时间,尽管事实上持续时间往往是结束时间减去开始时间。我已更改它以匹配您想要的输出,而不是“理智”的期望。
下面是一段文字记录,您可以看到它的实际效果:
pax$ awk 'BEGIN{OFS="\t"}NR==1{$5="Time_diff"}NR>=2{if($4!="Failed"){$5=$3-$4}}1' <inputFile.txt |column -t
Done City Start_time End_time Time_diff
Yes Chicago 18 10 8
Yes Atlanta 208 11 197
No Minnetonka 57 Failed
Yes Hopkins 112 80 32
No Marietta 2018 Failed
顺便说一句,您可能想考虑当您开始从纽约
、圣安东尼奥
获取信息时会发生什么, 盐湖城
或者更糟的是 Maccagno con Pino e Veddasca
:-)
关于awk - 如果其中一列有字母,则跳过该行的操作 - bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53808186/