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


30

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

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

Answers:


31

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

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

该命令告诉awk要打印的行。该变量$3包含第3列的全部内容,方括号是数组访问权限。因此,对于文件名中每行的第三列,seen如果未!事先设置节点(column3)的内容,则将命名数组的节点递增并打印该行。

awk如果输入文件中的列之间用分隔符space或它们Tab之间分隔,则上述命令将起作用,如果用其他内容分隔列,则需要使用-F选项将其告知awk 。因此,例如,如果所有列都以comma(,)分隔,并希望基于第三列use -F','选项删除行。

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

18

sort该命令已经过优化,可以处理大文件。因此,您可以很好地sort在文件上使用该命令,因为

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

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


正想发表评论,那只-u会删除重复的,不会删除重复的 ...但是我错了。
随机

@Ramesh可以完成工作,但排序会更改行的顺序,我猜这并非总是如此。
巴拉特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.