![从非常大的文本文件中删除重复的行](https://linux22.com/image/1387332/%E4%BB%8E%E9%9D%9E%E5%B8%B8%E5%A4%A7%E7%9A%84%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E4%B8%AD%E5%88%A0%E9%99%A4%E9%87%8D%E5%A4%8D%E7%9A%84%E8%A1%8C.png)
我有一个非常大的文本文件(> 50 GB),但大多数行都是重复的,所以我想删除它们。有没有办法从文件中删除重复的行,并处理> 2GB的文件?因为到目前为止我发现的每种方法都只能处理小文件。
答案1
假设所有行都短于 7kB,并且您已经从 cygwin/unix 安装了 bash、dd、tail、head、sed 和 sort:
{
i=0
while LANG= dd 2>/dev/null bs=1024 skip=${i}000 if=large_text_file count=1021 \
| LANG= sed -e '1d' -e '$d' | LANG= sort -u ;
do
i=$((1+$i))
done
LANG= dd 2>/dev/null bs=1024 skip=${i}000 if=large_text_file count=1021 \
| LANG= tail -n 1
LANG= head -n 1 large_text_file
} | LANG= sort -u > your_result
这会将文件划分为 1024000 字节的块,并1021
从下一个块中添加 3*7*1024 字节( 中的“21”)。由于划分可能会切断一行,因此每个块的第一行(1d
)和最后$d
一行( )将被破坏(sed
)。
因此为了补偿,再次提取包含最后一块的内容并且只保留其最后一行(tail -n 1),并且再次提取第一行(head -n 1)。
当循环失败时,最后一块已被提取。
sort -u
可以将其视为压缩器,但它仅对输入进行排序,然后跳过重复项。第一个“排序”压缩所有块。第二个sort
再次压缩所有这些块的连接(自第三次编辑以来,上述代码中就缺少了第二个sort
,抱歉)。
你说的是文本文件,但我无论如何都认为是二进制文件,因此LANG=
(也变得更快)。
答案2
在 AWS/GCE 中启动 Linux 实例,并使用“uniq”。OSX 也有它...
文档在这里:http://www.thegeekstuff.com/2013/05/uniq-command-examples/