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


16

我的问题与此问题类似,但有两个不同的约束:

  • 我有一个很大的\n定界词表-每行一个词。文件大小从2GB到最大10GB不等。
  • 我需要删除所有重复的行。
  • 该过程可以在删除重复项的过程中对列表进行排序,但不是必需的。
  • 分区上有足够的空间来容纳输出的新的唯一单词列表。

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

sort -u wordlist.lst > wordlist_unique.lst
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)

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


Answers:


18

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

您可以使用的完整命令可能会适合您的工作:

sort -us -o wordlist_unique.lst wordlist.lst

您可能还想阅读以下URL:

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

这比手册页更全面地解释了排序。


感谢您的建议,不幸的是,使用--output仍无法解决内存不足错误。运行那仍然给我sort: write failed: /root/tmp/sortVxscLn: No space left on device。这个问题有点烦人,因为它不会立即失败。似乎您必须等待内存用完才能出错。
greatwolf 2011年

8
@Victor T .:这不是内存不足错误,而是磁盘空间不足错误。/ root是否位于与您的数据不同的文件系统上?如果是这样,请使用-T /-temporary-directory选项sort来使用具有更多可用空间的文件系统。
卡姆(Camh)2011年

@camh谢谢你的把戏。没意识到您可以指定要使用哪个中间缓冲区。
greatwolf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.