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

Zac*_*h C 38 awk text-processing

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

awk '!seen[$0]++' filename
Run Code Online (Sandbox Code Playgroud)

αғs*_*нιη 43

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

awk '!seen[$3]++' filename
Run Code Online (Sandbox Code Playgroud)

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

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

awk -F',' '!seen[$3]++' filename
Run Code Online (Sandbox Code Playgroud)


Ram*_*esh 22

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

sort -u -t' ' -k3,3 file
Run Code Online (Sandbox Code Playgroud)
  • -u - 仅打印独特的线条。
  • -t- 指定分隔符。在此示例中,我仅使用空格作为分隔符。
  • -k3,3 - 在第 3 个字段上排序。

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

  • 本来想尖刻地评论说“-u”只会删除重复的_行_,而不是重复的_键_......但我错了。 (3认同)