join コマンドの練習

join コマンドを使ったファイルの結合を練習してみます。
テスト用にファイル breeds と dogs を用意しました。
2 つとも 1 行目はヘッダです。データはソートされていないです。

$ cat breeds 
id breed
4 maltese
1 poodle
3 frenchbulldog
2 pomeranian
5 husky 

$ cat dogs 
id name breed_id
2 koro 5 
1 sofia 4
3 louis 3

結合できなかった行を表示しない場合(内部結合?)

後ほど出てきますが -a オプションを付けないと
結合できなかった行は表示されません。

まずは dogs の breed_id で結合してみます。
join コマンドでは対象データがソートされている必要があるので
sort した結果を join に渡しています。ヘッダ行は邪魔なので
sort 前に sed '1d' で消しています。
join の -1 3 -2 1 は 1 つめのファイルの 3 つめのフィールドと
2 つめのファイルの 1 つめのフィールドを結合するという意味です。

$ join -1 3 -2 1 <(sed '1d' dogs | sort -k3) <(sed '1d' breeds | sort)
3 3 louis frenchbulldog
4 1 sofia maltese
5 2 koro  husky 

join で -o を使用すると表示するフィールドを選択できます。
1.1 は 1 つめのファイルの 1 つめのフィールドという意味です。

$ join -1 3 -2 1 -o 1.1 1.2 1.3 2.2 <(sed '1d' dogs | sort -k3) <(sed '1d' breeds | sort)
3 louis 3 frenchbulldog
1 sofia 4 maltese
2 koro 5 husky

今度は breeds の id で結合してみます。-a オプションが無いので
poodle, pomeranian は表示されません。

$ join -1 1 -2 3 -o 1.1 1.2 2.1 2.2 <(sed '1d' breeds | sort) <(sed '1d' dogs | sort -k3)
3 frenchbulldog 3 louis
4 maltese 1 sofia
5 husky 2 koro

結合できなかった行を表示する場合(外部結合?)

上記の poodle, pomeranian が表示されなかったコマンドに -a 1 を付けて
実行してみます。-a 1 -a 2 という使い方もできるらしいです。
-e で一致するフィールドが無い時に表示する文字列を指定します。

$ join -a 1 -1 1 -2 3 -o 1.1 1.2 2.1 2.2 -e NULL <(sed '1d' breeds | sort) <(sed '1d' dogs | sort -k3)
1 poodle NULL NULL
2 pomeranian NULL NULL
3 frenchbulldog 3 louis
4 maltese 1 sofia
5 husky 2 koro

参考にさせていただいたサイト