join 共通の項目をキーにして、2つのファイルの行を結合する
join [オプション] ファイル1 ファイル2試してみる
join -t, names.csv depts.csv1列目(キー)が同じ行を結合します。-t, はカンマ区切りの指定です。
join -t, -a 1 names.csv depts.csv-a 1 で、1つ目のファイルにしか無い行(4 Ito)も出力します。
join -t, -v 1 names.csv depts.csv-v 1 で、1つ目にだけあって、結合できなかった行だけを出力します。
join -t, -o 1.2,2.2 names.csv depts.csv-o で、出力する項目を指定します。1.2 は1つ目のファイルの2列目です。
join -t, -1 1 -2 1 names.csv depts.csv | sort -t, -k3キーの列を -1 と -2 で指定し、結果を部署名で並べ替えます。
主なオプション
-t 文字 | 区切り文字を指定する(既定は空白) |
|---|---|
-1 列 / -2 列 | ファイル1、ファイル2のキーとなる列を指定する |
-a 1|2 | 結合できなかったファイル1(または2)の行も出力する |
-v 1|2 | 結合できなかったファイル1(または2)の行だけ出力する |
-o 形式 | 出力する項目を、ファイル番号.列 の形で指定する |
-i | キーの大文字と小文字を区別しない |
解説
基本
join は、2つのファイルで共通する項目(キー)の値が同じ行どうしを結合します。データベースの結合に似た処理で、社員番号をもとに、氏名の表と部署の表を1つにまとめる、といった使い方ができます。
入力は並べ替えておく
2つのファイルは、キーの列で並べ替えられている必要があります。並んでいないと、結合されない行が出たり、警告が出たりします。並んでいないときは、先に sort をかけます。
キーと区切り
キーは、既定では両方のファイルの1列目です。別の列を使うときは -1、-2 で指定します。区切りは既定では空白で、CSVなどでは -t, と指定します。出力は、キー、ファイル1の残りの項目、ファイル2の残りの項目の順です。
結合できない行
既定では、相手がいない行は出力されません。-a は、相手がいない行も含めて出力します。-v は、相手がいない行だけを出力します。
paste との違い
paste は行番号が同じ行を並べるだけです。join は、キーの値が同じ行を探して結合します。