删除大型文本列表中的重复项

删除大型文本列表中的重复项

我已经在互联网和 stackexchange 上搜索过这个。尽管有很多类似的主题,但我还没有找到解决方案。

因此,我有一个相当大的列表(大约 20GB),其中包含大约 5% 的重复行。我想过滤此列表,以便删除其中一个重复项。例子:

输入:

test123
Test123
test
test123
test 123

输出:

test123
Test123
test
test 123

列表是否排序并不重要。

sort -u -o output.txt也尝试过sort -us -o output.txt。它适用于较小的文件,但是当我尝试处理超过大约的文件时。 4GB,生成的文件小得可疑,而且它不是 .txt 文件,而是显然变成了“emacs-lisp-source-text”。

如果有人能帮助我,我将非常感激!

答案1

使用 GNU coreutils 8.26 中的 GNU 进行测试sort,我对 5GiB 文件进行排序没有问题。所以,你可以尝试安装那个。

但要记住的事情:

  • sort -u不会为您提供独特的行,而是排序相同的所有行之一。特别是在 GNU 系统上,以及在您的典型语言环境中,有几个字符的排序相同。如果您想要字节级别的唯一行,请使用LC_ALL=C sort -u.
  • sort对大输入使用临时文件来分块排序,以免耗尽整个内存。如果你的临时目录没有足够的空间(通常/tmp除非你设置了$TMPDIR),那么它将失败。设置$TMPDIR(另请参阅-TGNU 选项sort)为具有足够可用空间的目录。

答案2

printf "">输出文件
cat 输入文件 |
而 IFS= 读取 -r 行;做
  如果 [ ! -z“$行”];然后
    如果 ! grep -Fxqe "$line" 输出文件;然后
      echo "$line">>输出文件;
完毕

解释

创建一个新的输出文件
printf "">OutputFile

将 InputFile 通过管道传送到 while 循环
cat InputFile |

读取每一行
while IFS= read -r line; do

处理空行
if [ ! -z "$line" ]; then

检查该行是否已在 OutputFile 中
如果结果为空,则它尚未在 OutputFile 中(即,它是唯一的)
if ! grep -Fxqe "$line" OutputFile; then

将行放入输出文件中
echo "$line">>OutputFile;

相关内容