首页 > 解决方案 > 获取重复行和文件的其余部分[大文件50G]

问题描述

我有一个50G的大文件,我想获取重复的行文件的其余部分,我使用两个命令来获取结果,这需要很长时间。

sort file.tsv | uniq -d > duplicateList.tsv 
sort file.tsv | uniq -u > clean_List.tsv

如您所见,该过程重复了两次,我只想制作一个命令并返回两个结果而不使用重复的命令

注意我可以使用 linux commande 或 Python 脚本

标签: pythonsed

解决方案


这可能对您有用(GNU sed),假设文件已经排序:

sed -Ee 'N;/^(.*)\n\1$/!{P;D};:a;$w duplicatesFile' \
     -e '$d;N;/(\n.*)\1$/ba;h;s/.*\n/\n/;x;s/(.*)\n.*/\1/w duplicatesFile' \
     -e 'x;D' file > nonduplicatesFile

概述:重复项被写入 ,duplicatesFile其余部分stdout被重定向到nonduplicatesFile.

最初创建了一个 2 行缓冲区并对其进行图案匹配以匹配重复的行。如果不是,则将第一行打印到 stdout,然后删除并重复,直到出现重复行。

对于重复的行,首先处理文件结尾的边缘情况,其中所有剩余的行都输出到duplicatesFile并停止处理。

对于另一种情况,模式空间被复制到保持空间,然后拆分为重复和非重复。写入 thenduplicatesFile和非重复的重复项,以换行符开头,然后使用D导致 sed 命令重新运行的命令删除换行符,而不是从file.

NB Sed 从来都不是最快的解决方案,也许在这种情况下,一段专用代码可能会提供所需的速度。


推荐阅读