我有一个包含 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