Linux / コマンド / join - 共通フィールドで2つのファイルを結合

joinは、2つのテキストファイルで同じキー値を持つ行を1行に結合します。行番号ではなくフィールド値で結合する点がpasteによる同じ行番号の結合とは異なります。

基本的に各ファイルの最初のフィールドをキーとして使用し、両方のファイルがそのキーでソートされている必要があります。基本動作は一致する行のみを出力することです。欠落したキーまで確認したい場合は-aまたは-vを参照してください。

基本的な文法

join [オプション] ファイル1 ファイル2

インストールされている実装とオプションは、配布版によって異なる場合があります。man joinで現在のシステムの説明を確認してください。

使用例

最初のフィールドで結合

以下は1行にキーと値を持つ、ヘッダーのないデータを想定しています。例えば LC_ALL=C sort -k1b,1 names.txt > names.sorted と LC_ALL=C sort -k1b,1 scores.txt > scores.sorted で、1番目のフィールドを比較するコピーを作ります。join にも同じ LC_ALL=C を指定してください。sortのキーと比較規則をそろえる必要があり、数値用の sort -n の順序がそのまま使えるとは限りません。

join names.sorted scores.sorted

区切り文字の指定

コロン区切りファイルは、両方の入力が同じ区切り形式を使用する必要があります。

join -t ':' users.sorted roles.sorted

最初のファイルの不一致行も含める

一致しない行も見たい場合は-a 1を追加します。

join -a 1 names.sorted scores.sorted

共通フィールドで結合した結果

既定では両ファイルの先頭フィールドをキーにし、一致したキーを1回だけ出した後、1番目のファイルの残りの列、2番目のファイルの残りの列を並べます。次の例はキー順に並んだ小さなデータを作ります。同名ファイルがまだない練習用の場所で実行してください。

printf 'a Ana\nb Bob\n' > names.txt
printf 'a 7\nb 12\n' > ages.txt
join names.txt ages.txt

例の出力:

a Ana 7
b Bob 12

入力ファイルは同じロケールと同じキー基準でソートする必要があります。一致しない行は基本出力に含まれないため、欠落しているキーも確認するには-a 1または-a 2を確認してください。例の2つのファイルは現在のディレクトリに生成されるため、作業が終わったら必要かどうか確認して整理します。

主なオプションと形式

オプション・形式 説明
-t 文字 入力・出力フィールドの区切り文字を指定します。
-1 N / -2 N 第一・第二ファイルの結合キーのフィールドを指定します。
-a 1 または -a 2 指定したファイルで一致しない行も出力します。
-v 1 または -v 2 指定したファイルで一致しない行だけを出力します。
-o 形式 出力フィールドと順序を指定します。

使用する際の注意点

入力は結合キー・区切り文字・ロケールをそろえて並べ替えます。GNU版では --check-order で順序を検査できますが、エラーの前に一部の結果が出る場合もあるため、終了状態を確認してから結果を使います。キーが重複すると同じキーを持つ行の組み合わせが出力され、片方に2行、他方に3行あれば6行になります。キーは文字列として照合されるため、例えば 1 と 01 を自動で同じ数値にはしません。

よくある質問

ソートされていないファイルをそのまま join できますか?

一般的な join 作業では、両方のファイルが結合フィールド基準でソートされている必要があります。ソート順とロケールを合わせたコピーを作成してから実行してください。

公式ドキュメント

オプションの正確な動作や実装ごとの差異は、join に関する公式ドキュメントで確認できます。