Linux には join という SQL使いにも馴染み易そうなコマンドがあります。
このコマンドは 2つのファイル(片方は標準入力可)の 指定したフィールドで結合した結果を返してくれます。
[text1.txt] 11111 aa1 22222 bb1 33333 cc1 55555 ee1
[text2.txt] 11111 aa2 33333 cc2 44444 dd2 66666 ff2
フィールドを指定しないと 1つ目のフィールドで結合します。
$ join test1.txt test2.txt
11111 aa1 aa2
33333 cc1 cc2
INNER JOIN ですね。
test1.txt と test2.txt の両方に存在する
"11111" と "33333" が出力されました。
外部結合もできます。
$ join -a1 test1.txt test2.txt 11111 aa1 aa2 22222 bb1 33333 cc1 cc2 55555 ee1
LEFT JOIN になりました。
test1.txt からは全行が出力されています。
RIGHT JOIN もできます。
$ join -a2 test1.txt test2.txt 11111 aa1 aa2 33333 cc1 cc2 44444 dd2 66666 ff2
test2.txt の全行になりました。
"-a1" "-a2" を両方指定することもできます。
$ join -a1 -a2 test1.txt test2.txt 11111 aa1 aa2 22222 bb1 33333 cc1 cc2 44444 dd2 55555 ee1 66666 ff2
これで、どちらかのファイルに フィールドが存在する行が 出力されました。
cut コマンドなどで切り出せば 何かに使えそうですね。
$ join -a1 -a2 test1.txt test2.txt | cut -f1
11111
22222
33333
44444
55555
66666
フィールドがマッチしない場合に 出力することもできます。
$ join -v1 test1.txt test2.txt 22222 bb1 55555 ee1
test1.txt にのみフィールドが存在する行が 出力されました。
"-v1" と "-v2" を どちらも指定すると どちらかのファイルにのみフィールドが存在する行が出力されます。
$ join -v1 -v2 test1.txt test2.txt 22222 bb1 44444 dd2 55555 ee1 66666 ff2
指定したフィールドでの比較なので diff とはちょっと違いますね。
2つのファイルの差分なので 何かのチェックに使えそうです。
$ join -v1 -v2 test1.txt test2.txt | cut -f1 22222 44444 55555 66666