diffまたは他のコマンドを使用して2つのテキストファイルを比較する方法

diffまたは他のコマンドを使用して2つのテキストファイルを比較する方法

2つの大きなファイル(それぞれ2gig)がリストされ、ランダムにソートされています。 2つのファイルの違いを見つけて出力ファイルに書き込む必要があります。

ファイル1:

abc1234
def4321
ghi1234

ファイル2:

ghi1234
jk16754
abc1234
mnop3847

出力:

def4321
jk16754
mnop3847

答え1

$ join -v 1 -v 2 <( sort file-1 ) <( sort file-2 )
def4321
jk16754
mnop3847

joinソートされた入力ファイルに対してリレーショナルJOIN操作を実行します(各ファイルの最初のタブを使用して列を区切りますが、これはコマンドラインから変更できます。マニュアルを参照)。デフォルトでは、一致するデータを出力しますが、およびを-v 1使用すると、-v 2各ファイルから一致する行を取得できます。いいえ他のファイルと一致します。

シェルがプロセス置換の使用をサポートしていない場合は、あらかじめ<(...)ファイルをソートしてください。コマンドを複数回実行したり、ファイルに対して別の操作を実行したい場合は、これを実行できます。

$ sort -o file-1.sorted file-1
$ sort -o file-2.sorted file-2
$ join -v 1 -v 2 file-[12].sorted

答え2

commとの組み合わせでsedあなたの要件を満たすことができます。

commファイルと比較して3つの列を出力します。列1はfile1にのみ存在するすべての行、列2はfile2にのみ存在するすべての行、列3は共通行です。

あなたの場合、列3の印刷を抑制し、sedを使用して列2項目からスペースを削除しようとしています。

bash-[533]$ comm -3 <(sort file-1) <(sort file-2) | sed -e 's/^\s*//'
def4321
jk16754
mnop3847

commファイルを並べ替える必要があります。上記の例は、ファイルを動的にソートし、出力をファイル記述子に送信する方法を示していますが、ファイルを事前にソートするとシステムリソースが簡単になり、次のようにコマンドを実行できます。

bash-[533]$ comm -3 file-1-sorted file-2-sorted | sed -e 's/^\s*//'
def4321
jk16754
mnop3847

答え3

そして違い注文する:

diff --changed-group-format="%>%<" --unchanged-group-format="" <(sort file1) <(sort file2)

出力:

def4321
jk16754
mnop3847

関連情報