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

时间:2015-04-17 13:25:12

标签: unix awk

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

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

输出:

1  10
2  20
3  35
4  20

1 个答案:

答案 0 :(得分:2)

是的,确定:

$ 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