bash 脚本 - 删除具有较小值的重复行

bash 脚本 - 删除具有较小值的重复行

这是一个示例文件:

1 5 20 40 60
2 1 20 20 20
2 2 30 30 30
4 5 40 40 40
7 2 50 30 30
7 1 20 20 20

我想删除第二列中具有更大值的重复行(第一列中具有相同的值)。我只想在第一列中保留具有唯一值的行。在这种情况下,我有重复的行:

2 1 20 20 20
2 2 30 30 30

7 2 50 30 30
7 1 20 20 20

我想删除第二列中具有较大值的行,在本例中:

2 2 30 30 30

7 2 50 30 30

因此,我的目标是选择并生成以下文件:

1 5 20 40 60
2 1 20 20 20
4 5 40 40 40
7 1 20 20 20

我想我已经设法在 awk 中做到这一点:

sort -nk2 | awk '{if(a[$1]){a[$1]=a[$1] } else {a[$1]=$0}}END{for (k in a) {print a[k]}}' | sort

但它适用于小文件。如何用更有效的东西替换它(对于具有近百万行的文件)?

答案1

你可以自己做这个sort。下面,第一个sort按第 1 列的升序排序,然后是第 2 列。然后将其通过管道传输到第二个,第二个sort为第 1 列中的每个不同值挑选一个记录。-s传递(稳定排序)标志以确保仅返回第 1 列每个值的第一条记录,由于之前的排序,该记录结果是第 2 列中具有最小值的记录。

sort -k1,1n -k2,2n file | sort -k1,1n -s -u

相关内容