awk - 如果其中一列有字母,则跳过该行的操作 - bash

标签 awk sed

我试图跳过对 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/

相关文章:

shell - 仅当存在第 3 个模式时 SED 删除(包括)2 个模式之间

regex - 使用正则表达式编辑电话列表模式

bash - 在 bash 脚本中将未知选项设置为 `s'

awk - 将行转换为列 Shell 脚本

linux - 使用 awk 创建文件

linux - 从 "sysstat"的输出中 Grep 特定字段

regex - 如何在 Linux 上从 id 中提取 uid 值?

linux - 使用 sed 在 Bash 中解析 HTML 表

bash - 如何从 awk 的输入 FILENAME 变量中删除路径 - basename 是否可用?

linux - Unix 中 ls -lsh 中的“总计”