如何在awk中删除具有相同第一列和下第二列的行

  • 本文关键字:一列 二列 删除 awk unix awk
  • 更新时间 :
  • 英文 :


我有一个包含 2 列的列表。在某些行中,我在第一列中具有相同的值。在这种情况下,我想删除第二列中值较低的行。例:输入:

1  10
2  20
3  15
3  5
3  35
4  20

输出:

1  10
2  20
3  35
4  20

是的,当然:

$ awk '{a[$1]=(a[$1]<$2?$2:a[$1])} END {for (i in a) print i, a[i]}' file
1 10
2 20
3 35
4 20

只需继续使用给定第 1 列的第 2 列的最大值填充数组a[]即可。最后,打印结果。

这使用了一个值默认在awk中0的事实。但是,如果某个索引的所有值始终为负数或零,则它将失败。为此,我们必须通过检查数组的特定索引是否存在来稍微改进脚本:

awk '{a[$1]=(($1 in a) && a[$1]>$2?a[$1]:$2)}
     END {for (i in a) print i, a[i]}' file

测试

$ cat a
1  10
2  20
3  -15
3  -5
3  -35
4  20
$ awk '{a[$1]=(($1 in a) && a[$1]>$2?a[$1]:$2)} END {for (i in a) print i, a[i]}'  a
1 10
2 20
3 -5
4 20

最新更新