非常に大きなテキストファイル(> 50 GB)がありますが、ほとんどの行が重複しているため、削除したいと思います。ファイルから重複行を削除し、2GBを超えるファイルを処理する方法はありますか?これまでに見つけたすべての方法は、小さなファイルでしか機能しないためです。
すべての行が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
はコンプレッサーと見なされる場合がありますが、入力を並べ替えてから重複をスキップするだけです。最初の「ソート」はすべてのチャンクを圧縮します。 2番目のsort
は、これらすべてのチャンクの連結を再度圧縮します(3番目の編集以降、2番目のsort
は上記のコードから欠落しています。申し訳ありません)。
あなたはテキストファイルを言ったが、とにかくバイナリを想定しているので、LANG=
(すべてが速くなる)。
AWS/GCEでLinuxインスタンスを起動し、「uniq」を使用します。 OSXにもあります...
ここのドキュメント: http://www.thegeekstuff.com/2013/05/uniq-command-examples/