はじめに

こんにちは!今回はjoinコマンドについて解説します。

joinは2つのソート済みファイルを共通キーで結合するコマンドです。SQLのJOINみたいな感じで、関連するデータをマージできます。

データベース操作みたいなことがコマンドラインでできるので、大量データ処理では超便利です。

joinコマンドとは

joinは、2つのソート済みファイルを指定されたキーフィールドで結合するコマンドです。

データベースの結合操作と同じく、2つのファイルに共通するキー値を持つ行同士をマッチングして、1つの行に統合します。CSVデータの統合やログファイルの相互参照に活躍します。

基本構文

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

重要: 両方のファイルが結合キーでソート済みである必要があります。デフォルトでは最初のフィールド(スペース区切り)をキーとします。

主なオプション

オプション 説明
-1 フィールド ファイル1の結合キーフィールド番号
-2 フィールド ファイル2の結合キーフィールド番号
-t 区切り文字 フィールドの区切り文字を指定
-o フォーマット 出力フォーマットを指定
-a ファイル番号 マッチしない行も出力
-v ファイル番号 マッチしない行のみ出力
-e 文字列 空フィールドの代替文字列

使用例

例1: 基本的な結合

1
join users.txt addresses.txt

実行結果:

1
2
3
1 alice Japan Tokyo
2 bob USA NewYork
3 charlie UK London

users.txtaddresses.txtの最初のフィールド(ID)が一致する行を結合します。

例2: CSVファイルの結合

1
join -t, employees.csv departments.csv

実行結果:

1
2
3
1,Alice,Engineering
2,Bob,Sales
3,Charlie,Marketing

カンマ区切りのファイルを結合します。-t,で区切り文字をカンマに変更。

例3: 異なるフィールドで結合

1
join -1 2 -2 1 table1.txt table2.txt

ファイル1の2番目フィールドと、ファイル2の1番目フィールドを結合キーとします。

例4: マッチしない行も含める

1
join -a 1 file1.txt file2.txt

実行結果:

1
2
3
1 apple green
2 banana yellow
3 cherry

ファイル1にだけある行も表示されます(ファイル2の情報は空)。

例5: マッチしない行のみ表示

1
join -v 1 file1.txt file2.txt

実行結果:

1
3 cherry

ファイル1にあるが、ファイル2に一致するものがない行だけを表示。

例6: 出力フォーマットの指定

1
join -o 1.1,2.2,1.2 data1.txt data2.txt

出力する列と順序を指定します。1.1はファイル1の1番目フィールド、2.2はファイル2の2番目フィールド。

例7: 空フィールドの代替文字列

1
join -a 1 -e "N/A" file1.txt file2.txt

マッチしない部分をN/Aで埋めます。

例8: パイプと組み合わせ

1
sort file1.txt | join - <(sort file2.txt)

未ソートのファイルをソートしながら結合します。

例9: 複数フィールドでの結合(工夫)

1
join -t: -1 1 -2 1 <(sort -t: -k1 passwd1.txt) <(sort -t: -k1 passwd2.txt)

コロン区切りのパスワードファイルを結合。

例10: テーブル形式で見やすく

1
join -t, -o 1.1,1.2,2.2,2.3 table1.csv table2.csv | column -t -s,

結合後にcolumnコマンドで整形。見やすいテーブル形式に。

Tips・注意点

ファイルは必ずソート済みにする

joinソート済みファイル専用です。未ソートだとおかしな結果になります。

1
2
3
4
# 正しい使い方
sort file1.txt > sorted1.txt
sort file2.txt > sorted2.txt
join sorted1.txt sorted2.txt

結合キーでソートする

複数フィールドで結合する場合は、その順序でソートしましょう。

1
2
3
# フィールド2を結合キーとする場合
sort -k 2 -t: file1.txt > sorted1.txt
join -1 2 -2 1 sorted1.txt file2.txt

commコマンドとの違い

  • comm: 同じフィールドで並んでいる行を比較(3列出力)
  • join: 指定フィールドで行をマッチングして結合(1行に統合)
1
2
comm file1.txt file2.txt    # 差分表示
join file1.txt file2.txt    # データ結合

実践的な使い方

顧客データの統合

1
join -t, -o 1.1,1.2,2.2,2.3 customers.csv orders.csv

顧客ID(キー)で顧客情報と注文情報を統合。

ログの相互参照

1
join -t' ' -1 2 -2 1 event_log.txt user_list.txt

イベントログ内のユーザーIDと、ユーザーリストを照合。

不在なデータの検出

1
join -v 1 <(sort active_ids.txt) <(sort expected_ids.txt)

期待されるが実際には存在しないIDを検出(監査用)。

テーブル形式での複合データ表示

1
join -t: -o 1.1,1.5,2.2 /etc/passwd shadow_data.txt | column -t -s: -J

パスワードファイルとシャドウデータを統合(ユーザー名、シェル、暗号化パスワード)。

まとめ

joinコマンドのポイント:

  • 2つのソート済みファイルをキーで結合する
  • -1-2: 各ファイルの結合キーフィールドを指定
  • -t: フィールド区切り文字を指定(デフォルトはスペース)
  • -o: 出力フォーマットを指定
  • -a: マッチしない行も出力
  • -v: マッチしない行のみ出力
  • ソート順序が重要!必ず結合キーでソートする

SQLみたいなデータ操作がLinuxコマンドラインでできます。大規模ファイル処理やデータ統合には欠かせないコマンドですね。