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