大きなマルチGBテキストファイルで重複行を削除する方法は?


16

私の質問はこの質問に似ていますが、いくつかの異なる制約があります。

  • 私は大きな\n区切りのワードリストを持っています-1行に1ワード。ファイルのサイズは、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)

他にどのようなアプローチを試すことができますか?


回答:


18

出力をリダイレクトする代わりに、-o/ --output=FILEオプションを指定してsortを使用してみてください。/で設定しbuffer-sizeてみることもできます。また、/を試してください。そして、manページを読んで、私が与えたすべての情報を提供します。-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

それは、manページよりもソートについて詳細に説明しています。


提案のおかげで、残念ながら--outputを使用してもメモリ不足エラーは修正されません。それを実行すると、まだ私に与えますsort: write failed: /root/tmp/sortVxscLn: No space left on device。問題は、すぐに失敗しないという点で少し面倒です。エラーが発生する前に、メモリが使い果たされるのを待つ必要があるようです。
グレートウルフ

8
@Victor T .:これはメモリ不足エラーではなく、ディスク容量不足エラーです。/ rootはデータとは異なるファイルシステムにありますか?その場合は、-T / --- temporary-directoryオプションsortを使用して、より多くの空き容量のあるファイルシステムを使用します。
カム

@camh、ありがとうございます。使用する中間バッファを指定できることに気づきませんでした。
グレートウルフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.