join コマンドは、2つのテキストファイルを共通するキー列(フィールド)で結合して出力するためのコマンドです。
同じIDやユーザー名で管理されたデータを1つにまとめたいときに利用されます。
構文(Syntax)
join [オプション] FILE1 FILE2
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
-1 N | FILE1のキーとするフィールド番号を指定 | join -1 2 -2 1 file1.txt file2.txt |
-2 N | FILE2のキーとするフィールド番号を指定 | join -1 1 -2 2 file1.txt file2.txt |
-o LIST | 出力するフィールドを指定 | join -o 1.1,2.2 file1.txt file2.txt |
-t CHAR | 区切り文字を指定(デフォルトは空白) | join -t ',' file1.csv file2.csv |
-a N | 片方のファイルのみにある行も出力 | join -a 1 file1.txt file2.txt |
-e STRING | 欠損値を指定文字で補う | join -e "-" -a 1 -a 2 file1.txt file2.txt |
実行例
共通フィールドで結合(デフォルト: 1列目)
# file1.txt
1 Alice
2 Bob
# file2.txt
1 Tokyo
2 Osaka
join file1.txt file2.txt
出力例:
1 Alice Tokyo
2 Bob Osaka
異なるフィールドをキーにして結合
# file1.txt
A 1
B 2
# file2.txt
1 Tokyo
2 Osaka
join -1 2 -2 1 file1.txt file2.txt
出力例:
1 A Tokyo
2 B Osaka
CSVファイルをカンマ区切りで結合
join -t ',' file1.csv file2.csv
結合キーが一致しない行も出力
# file1.txt
1 Alice
2 Bob
3 Carol
# file2.txt
1 Tokyo
2 Osaka
join -a 1 file1.txt file2.txt
出力例:
1 Alice Tokyo
2 Bob Osaka
3 Carol
エラー例(ファイルが存在しない)
join file1.txt notfound.txt
出力例:
join: notfound.txt: No such file or directory
関連コマンド
cut: ファイルから特定のフィールドを抽出するコマンド。sort: データをキー順に並べるコマンド(joinの前処理に必須)。comm: 2つのファイルの差分を比較するコマンド。
備考
- 入力ファイルは事前に同じキー列でソートしておく必要があります。
- 区切り文字はデフォルトで空白やタブとなります。CSVを扱う場合は
-t ','を明示的に指定します。 - マルチバイト文字を含む場合、環境によっては正しく処理できないことがあります。
参考
- manページ: https://man7.org/linux/man-pages/man1/join.1.html
- GNU Coreutils公式: https://www.gnu.org/software/coreutils/

コメント