我试图跳过 End_time 值为“失败”的列行上的操作。

这是我的实际文件。

check_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

那我怎么跳过呢?

最佳答案

请您尝试以下操作。(这里考虑到您的 Input_file 的最后一个字段将仅是此顺序,并且不会有任何其他附加字段,如果有,那么您可能需要调整字段编号,因为以防您的城市的值在其中有空间然后从开始的字段编号将在简单地区分所有行的值时产生问题,因为字段值将与每行不同)

awk '
FNR==1{
  print $0,"Time_Diff"
  next
}
$NF!="Failed"{
  $(NF+1)=$(NF-1)-$NF
}
1
'  Input_file | 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

说明: 现在为上面的代码添加完整的解释。
awk '                      ##Starting awk program from here.
FNR==1{                    ##Checking conditoin if line is very first line then do following.
  print $0,"Time_Diff"     ##Printing current line with string Time_Diff here on very first line to print headings.
  next                     ##next is awk keyword which will skip all further statements from here.
}
$NF!="Failed"{             ##Checking if last field $NF where NF is number of fields and $ means in awk field value is NOT failed then do following.
  $(NF+1)=$(NF-1)-$NF      ##Add a new column by doing $(NF+1) whose value will be difference of 2nd last column and last column as per samples.
}                          ##Closing this condition block here.
1                          ##Mentioning 1 will print edited/non-edited line for Input_file.
' Input_file   |           ##Mentioning Input_file name and passing awk program output to next command by using pipe(|).
column -t                  ##Using column -t will print the output in TAB separated format.

关于awk - 如果其中一列有字母,则跳过该行的操作 - bash,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53808186/

10-13 06:18