从非常大的文本文件中删除重复的行

从非常大的文本文件中删除重复的行

我有一个非常大的文本文件(> 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/

相关内容