如何删除大型多 GB 文本文件中的重复行?

gre*_*olf 17 linux text-processing uniq

我的问题类似于这个问题,但有几个不同的限制:

  • 我有一个很大的带\n分隔符的词表——每行一个词。文件大小从 2GB 到 10GB 不等。
  • 我需要删除任何重复的行。
  • 该过程可能会在删除重复项的过程中对列表进行排序,但这不是必需的。
  • 分区上有足够的空间来保存输出的新的唯一词表。

我已经尝试了这两种方法,但它们都因内存不足错误而失败。

sort -u wordlist.lst > wordlist_unique.lst
Run Code Online (Sandbox Code Playgroud)
awk '!seen[$0]++' wordlist.lst > wordlist_unique.lst
awk: (FILENAME=wordlist.lst FNR=43601815) fatal: assoc_lookup: bucket-ahname_str: can't allocate 10 bytes of memory (Cannot allocate memory)
Run Code Online (Sandbox Code Playgroud)

我可以尝试哪些其他方法?

lae*_*ade 20

尝试使用带有-o/--output=FILE选项的sort而不是重定向输出。您也可以尝试buffer-size使用-S/设置--buffer-size=SIZE。另外,尝试-s/ --stable。并阅读手册页,它提供了我提供的所有信息。

您可以使用的完整命令可能适用于您正在执行的操作:

sort -us -o wordlist_unique.lst wordlist.lst
Run Code Online (Sandbox Code Playgroud)

您可能还想阅读以下 URL:

http://www.gnu.org/s/coreutils/manual/html_node/sort-invocation.html

这比手册页更彻底地解释了排序。

  • @Victor T.:这不是内存不足错误,而是磁盘空间不足错误。/root 与您的数据在不同的文件系统上吗?如果是这样,请使用 -T/--temporary-directory 选项`sort` 以使用具有更多可用空间的文件系统。 (9认同)