我有一个包含这样几行的文件:
r1 300 #keep this one
r1 200
r1 100
r1 100
r2 100 # "
r2 200
r3 200 # "
r3 100
r3 300
我只需要保留每个“ block ”的第一行(r1、r2、r3 等)
期望的输出:
r1 300
r2 100
r3 200
有什么建议吗?
请您参考如下方法:
您可以跟踪对第一列的更改,并且仅在不同时打印:
awk '$1 != last; {last = $1}' file
分号之前的部分有一个隐含的{print} Action ,所以如果第一列不等于last 的值将打印该行(已编辑, 谢谢)。分号后的代码块无条件运行,并将第一列的值赋给变量last。
稍微安全一点的是单独处理第一行(就像我最初所做的那样)并添加一个额外的条件:
awk '!last || $1 != last; {last = $1}' file
当第一行的第一列包含数字 0 时,这会处理这种情况,在它被赋值之前将被评估为等于 last。
如果第一列的内容从不重复,您可以使脚本更简单,如评论中指出的那样(谢谢):
awk '!seen[$1]++' file
这只打印第一列还没有被看到的行,因为 seen[$1] 的计算结果为 false。 ++ 表示在具有相同 $1 值的后续行中,seen[$1] 已递增,因此计算结果为真。
