我有一个包含2列的列表。在某些行中,我在第一列中具有相同的值。在这种情况下,我想删除第二列中值较低的行。 例: 输入:
1 10
2 20
3 15
3 5
3 35
4 20
输出:
1 10
2 20
3 35
4 20
答案 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