如何从大于 4GB 的文件中删除重复的文本行?

如何从大于 4GB 的文件中删除重复的文本行?

我正在寻找一个开源(可能是 64 位)Windows 文本编辑器,它允许我从非常大(4GB+)的文本文件中删除重复的行。

您用什么来从大型文本文件中删除重复的行?

答案1

sort -u file > outfile

一个方便的 Win32 本机端口sort位于Unx工具类

对于“删除重复项”的更复杂含义,可以使用 Perl(等)。

答案2

如果你有 Cygwin 或 MinGW,你可以使用以下命令完成此操作

cat file | sort | uniq >> outfile

假设您想要唯一的行。我不知道这将如何执行,因为对如此大的数据集进行排序可能需要很长时间(或者如果它已经排序,您可以忽略该部分)或者这些命令究竟如何运行(它们是否会消耗 4GB 的 RAM)。

答案3

您可以使用 PilotEdit 删除大文件里的重复行。

答案4

我也在关于的重复问题上发布了这个答案>50GB 文件

假设所有行都短于 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 字节的块,并从下一个块中添加 3*7*1024 字节(1021 中的“21”)。由于分割可能会切断一行,因此每个块的第一行(1d)和最后一行($d)将被破坏(sed)。

因此为了补偿,再次提取包含最后一块的内容并且只保留其最后一行(tail -n 1),并且再次提取第一行(head -n 1)。

当循环失败时,最后一块已被提取。

sort -u 可能被视为压缩器,但它只对输入进行排序,然后跳过重复项。第一个“sort”压缩所有块。第二个sort再次压缩所有这些块的连接(sort自第三次编辑以来,第二个就从上面的代码中消失了,抱歉)。

您说的是文本文件,但我无论如何都假设是二进制文件,因此 LANG=(也变得更快)。

相关内容