正如标题所说,如何将当前的 $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