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