join コマンドでできることイロイロ

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

Google サイト内検索

Amazonアソシエイト