使用 awk,如果前一行具有相同的 $3 值,如何删除当前行?

使用 awk,如果前一行具有相同的 $3 值,如何删除当前行?

正如标题所说,如何将当前的 $3 与上一行的 $3 进行比较,如果相等,则删除当前行?

例如这个文件

100.824 4 Packet to 
101.027 1 Received  
102.23 1 Received  
229.393 4 Packet to
229.605 1 Received 

成为

100.824 4 Packet to 
101.027 1 Received  
229.393 4 Packet to
229.605 1 Received 

答案1

要“删除当前行”,只需不打印它即可。

所以你要做的就是仅在其第三个字段时打印当前行是不同的来自上一行的第三个字段。

这要求我们将第 3 个字段保存在一个变量中,以便能够将下一行的第 3 个字段与其进行比较。

awk 'NR == 1 || $3 != prev; { prev = $3 }' file

这将无条件打印第一行,以及第三个字段与 中的值不同的任何行prev。这相当于

awk 'NR == 1 || $3 != prev { print $0 } { prev = $3 }' file

但我们使用的事实是,when 条件测试的默认操作被评估为真的, 是打印当前行。

一旦输出发生或未发生,prev就设置为当前行的第三个字段,以便在处理下一行时使用。

例子:

$ cat file
1 2 3
1 2 3
a b c
d e f
1 2 3
1 2 3
$ awk 'NR == 1 || $3 != prev; { prev = $3 }' file
1 2 3
a b c
d e f
1 2 3

给定您的示例文件,该awk脚本将生成

100.824 4 Packet to
101.027 1 Received
229.393 4 Packet to
229.605 1 Received

如果你能保证第一行的第三个字段是始终非空,那么你可以将awk命令简化为

awk '$3 != prev; { prev = $3 }' file

相关内容