web-dev-qa-db-ja.com

4GBを超えるファイルから重複するテキスト行を削除するにはどうすればよいですか?

非常に大きな(4GB以上)テキストファイルから重複行を削除できるオープンソース(おそらく64ビット)のWindowsテキストエディタを探しています。

大きなテキストファイルから重複する行を削除するために何を使用しますか?

6
darkAsPitch

sort -u file > outfile

sortの便利なWin32ネイティブポートは nxUtils にあります

「重複を削除する」のより複雑な意味については、Perl(et al)があります。

5
RedGrittyBrick

CygwinまたはMinGWをお持ちの場合は、おそらくこれを次の方法で実現できます。

cat file | sort | uniq >> outfile

一意の線が必要だと仮定します。これがどのように実行されるかはわかりません。なぜなら、大きなデータセットの並べ替えにはおそらく長い時間がかかるからです(または、すでに並べ替えられている場合は、その部分を省略できます)。正確には、これらのコマンドがどのように機能するか(4GBのラムかどうか)。

2
Snap

PilotEditを使用すると、巨大なファイル内の重複行を削除できます。

1
draco

PilotEdit というツールを見つけました。これはそれを実行できました。

1
Muis

> 50GBファイル に関する重複した質問にもこの回答を投稿しました

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

0
user2987828