web-dev-qa-db-ja.com

非常に大きなテキストファイルから重複行を削除する

非常に大きなテキストファイル(> 50 GB)がありますが、ほとんどの行が重複しているため、削除したいと思います。ファイルから重複行を削除し、2GBを超えるファイルを処理する方法はありますか?これまでに見つけたすべての方法は、小さなファイルでしか機能しないためです。

3
Muis

すべての行が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=(すべてが速くなる)。

4
user2987828

AWS/GCEでLinuxインスタンスを起動し、「uniq」を使用します。 OSXにもあります...

ここのドキュメント: http://www.thegeekstuff.com/2013/05/uniq-command-examples/

0
Clustermagnet