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