根据一列中的重复项删除行而不进行排序

根据一列中的重复项删除行而不进行排序

我有大型 3 列文件(约 10,000 行),当该行第三列的内容出现在另一行的第三列中时,我想删除行。文件的大小使排序有点麻烦,我不能使用类似下面的代码,因为整行并不相同;只是第 3 列的内容。

awk '!seen[$0]++' filename

答案1

只需将 awk 命令更改为您想要根据该列删除重复行的列(在您的情况下为第三列):

awk '!seen[$3]++' filename

该命令告诉我们awk要打印哪些行。该变量$3保存第 3 列的全部内容,方括号是数组访问。因此,对于 filename 中的每第三列,seen如果该节点(第 3 列)的内容!先前未设置 ( ),则指定数组的节点会递增,并且会打印该行。通过这样做,始终将保留第一行(第三列唯一)。

如果输入文件中的列用空格/制表符分隔,上面的方法将起作用,如果是其他情况,则需要使用其选项告诉 awk -F。因此,例如,如果以逗号 ( ,) 分隔的列并且想要删除基于第三列的行,请使用以下命令:

awk -F',' '!seen[$3]++' filename

答案2

sort命令已经针对处理大文件进行了优化。因此,您可以很好地sort在文件中使用该命令,

sort -u -t' ' -k3,3 file
  • -u- 仅打印唯一的行。
  • -t- 指定分隔符。在此示例中,我仅使用空格作为分隔符。
  • -k3,3- 按第三个字段排序。

你可以参考答案表明 GNU 排序实际上是对大文件进行排序的更好方法。就您而言,我认为即使没有-parallel,您也可以在没有太多时间延迟的情况下实现最终结果。

相关内容