2つの大きなテキストファイルの差分


32

2つの大きなファイル(それぞれ6 GB)があります。これらはソートされず、改行文字(\n)がセパレーターとして使用されます。どうすればそれらを比較できますか?24時間以内に完了します。

回答:


45

最も明白な答えは、diffコマンドを使用することです。おそらく、-speed-large-filesパラメーターを追加することをお勧めします。

diff --speed-large-files a.file b.file

未ソートのファイルに言及しているため、最初にファイルをソートする必要があるかもしれません

sort a.file > a.file.sorted
sort b.file > b.file.sorted
diff --speed-large-files a.file.sorted b.file.sorted

2番目のソート出力を直接diffにパイプすることで、追加の出力ファイルを作成することを節約できます

sort a.file > a.file.sorted
sort b.file | diff --speed-large-files a.file.sorted -

明らかに、これらは利用可能なメモリが十分にあるシステムで最もよく動作し、おそらく十分な空きディスク容量も必要になるでしょう。

あなたがこれらを以前に試したことがあるかどうかはあなたの質問から明らかではありませんでした。もしそうなら、何がうまくいかなかったのかを知るのに役立ちます(時間がかかりすぎたなど)。私はいつも、ファイルのドメイン固有のプロパティが異なることを可能にするいくつかの非常にドメイン固有のプロパティがない限り、株式の並べ替えとdiffコマンドは少なくともカスタムコマンドと同様に行う傾向があることを発見しました。


2
+1。名前付きパイプを持つすべての一時ファイルを省略できます。を使用mkfifo[ab].file.sortedて、の出力として使用する前に作成しますsort。両方sortのsを&バックグラウンドに入れ、両方をdiffのファイル名として使用します。
krissi

15
@krissiまた、この構文を使用して同じ効果を達成することができますdiff <(command 1) <(command 2)
マイケルMrozek

感謝しました。数GBのメモリが必要でしたが、
jonasl

7
私のような誰かが、なぜ疑問に思うならば<(cmd1) <(cmd2)(それは二回、標準入力をリダイレクトするように聞こえるよう!)構文の作品を、してみてくださいecho hello <(cmd1) <(cmd2)。あなたはhello /dev/fd/63 /dev/fd/62突然それを明らかにするようなものを見るでしょう;)
アレックス

3
私の経験では、--speed-large-files十分なRAMがない場合、このオプションは役に立ちません。また、保存したい複数行のレコード構造がある場合、事前ソートは役に立ちません。オプションは興味深いが、出力(@unhammerによって)上記に言及rdiffし、bsdiffむしろバイナリです。bdiffHeirloom Toolboxからのインストールは大変な作業のように見えます(Heirloom devtools、extinctヘッダーファイルなどが必要です)。本当に努力する価値はありますか?他の選択肢はありますか?
クリスチャンピエチュ

5

入力を並べ替えて、入力が並べ替えられていることをdiffプログラムに伝えると、大幅に高速化されます。私はdiffそのようなオプションを知っていませんが、commソートされた入力を想定しており、それがあなたの目的に十分であれば、はるかに速くなります。


commこれには素晴らしい働きをしましたが、これまで聞いたことはありませんが、明らかにcoreutilsにあります。
theferrit32
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.