这是一个示例文件:
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