我有大型 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
,您也可以在没有太多时间延迟的情况下实现最终结果。