Linuxコマンド辞典 joinコマンド(テキスト処理)

共通性のあるファイルを列で結合する「join」コマンドの概要と使い方を記載しています。

RHEL Fedora CentOS Vine Deblan Ubuntu Plamo

参考サイト:Man page of INSTALL

概要・使用方法

引数に指定されたファイル1とファイル2の各列(フィールド)を比べ、同じだった値の場合は結合して出力します。入力ファイルは以下の標準形式として扱われます。扱うファイルは事前に昇順にソートされている必要があります。

フィールド    値・・・

値は1つに限られず、複数記述することができます、-jオプションや-1/-2オプションで先頭以外もフィールドとして扱えます。フィールドと値の区別はスペースですが、-tオプションで「:」などの別の文字を区切りとして利用もできます。

書式

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

オプション

-i列(フィールド)を調べる際に大文字/小文字を区別しない
-e 文字列列(フィールド)はあるが値がない場合は指定した文字列を出力する
-a 1もしくは2列(フィールド)が相手ファイルになくても出力する。「1もしくは2」は、引数に渡したファイル名1、ファイル名2を指す
-o フォーマット指定したフォーマットで出力する
-t 文字列(フィールド)区切り文字に指定した文字を利用する
-v 1もしくは2結合した行を表示しない。「1もしくは2」は、引数に渡したファイル名1,ファイル名2を指す
-1 項目番号ファイル1の指定項目番号をフィールドに利用する
-2 項目番号ファイル2の指定項目番号をフィールドに利用する
-j 項目番号「-1 番号 -2 番号」と同じ出力をする
–header両ファイルの1行目はヘッダとして結合せずに出力する
-z
–zero-terminated
改行の代わりにNULL文字を出力する

2つのファイルをJOINする

2つのファイルの先頭のフィールドが同じ行じJOINして出力します。テキストファイルはソートされている必要があります。

JOINはフィールドが同じ値であった行同士を結合することを言います。SQLのINNER JOIN句に似ています。

$ join ファイル1 ファイル2

実行結果

[sunarin@localhost work]$ cat comm1.txt 
1 A1
2 B1
3 C1
4 D1
5 E1
[sunarin@localhost work]$ cat comm2.txt 
1 A2
2 B2
3 C2
4 D2
5 E2
[sunarin@localhost work]$ join comm1.txt comm2.txt 
1 A1 A2
2 B1 B2
3 C1 C2
4 D1 D2
5 E1 E2
[sunarin@localhost work]$ 

片方にしかないフィールドも表示する

片方にしかないフィールドも表示する場合は、ファイル1側を表示する場合は、「-a1オプション」を指定します。ファイル2側を表示する場合は、「-a2オプション」を指定します。

$ join -a1 ファイル1 ファイル2
$ join -a2 ファイル1 ファイル2

実行結果

ファイル1にしかないフィールドを表示

[sunarin@localhost work]$ cat comm1.txt 
1 A1
2 B1
3 C1
4 D1
5 E1
6 G1
[sunarin@localhost work]$ cat comm2.txt 
1 A2
2 B2
3 C2
4 D2
5 E2
7 I2
[sunarin@localhost work]$ join comm1.txt comm2.txt 
1 A1 A2
2 B1 B2
3 C1 C2
4 D1 D2
5 E1 E2
[sunarin@localhost work]$ join -a1 comm1.txt comm2.txt 
1 A1 A2
2 B1 B2
3 C1 C2
4 D1 D2
5 E1 E2
6 G1
[sunarin@localhost work]$ 

ファイル2にしかないフィールドを表示

[sunarin@localhost work]$ join -a2 comm1.txt comm2.txt 
1 A1 A2
2 B1 B2
3 C1 C2
4 D1 D2
5 E1 E2
7 I2
[sunarin@localhost work]$ 

各ファイルにしかないフィールドを表示する

各ファイルにしかないフィールドを表示する場合は、「-v1」オプション及び「-v2」オプションを使用します。

$ join -v1 -v2 ファイル1 ファイル2

実行結果

[sunarin@localhost work]$ join -v1 -v2  comm1.txt comm2.txt 
6 G1
7 I2

フィールドの区切り文字を指定してJOINする

空白が含まれている文字列をJOINする場合は、-tオプションで区切り文字を空白から別の区切り文字に変更します。

$ join -t "区切り文字" ファイル1 ファイル2

実行結果

ISBN番号を基に本のタイトルと価格をJOINしています。

[sunarin@localhost work]$ cat book1.txt 
978-4047334632:1430
978-4058016701:1320
978-4065273074:990
978-4088808192:638
978-4866801711:1540
978-4907474010:1540
[sunarin@localhost work]$ cat book2.txt 
978-4047334632:漫画家と異星人 漫画家が婚活で数学者と出会った話
978-4058016701:マンガでわかる ネコさんが教える疲れリセット教室-体と心のどんより、重だる~をスッキリ!
978-4065273074:掃除婦のための手引き書 ――ルシア・ベルリン作品集 (講談社文庫)
978-4088808192:終末のハーレム 1
978-4866801711:やる気に頼らず「すぐやる人」になる37のコツ (科学的に先延ばしをなくす技術)
978-4907474010:二番目の悪者
[sunarin@localhost work]$ join -t ":" book1.txt book2.txt 
978-4047334632:1430:漫画家と異星人 漫画家が婚活で数学者と出会った話
978-4058016701:1320:マンガでわかる ネコさんが教える疲れリセット教室-体と心のどんより、重だる~をスッキリ!
978-4065273074:990:掃除婦のための手引き書 ――ルシア・ベルリン作品集 (講談社文庫)
978-4088808192:638:終末のハーレム 1
978-4866801711:1540:やる気に頼らず「すぐやる人」になる37のコツ (科学的に先延ばしをなくす技術)
978-4907474010:1540:二番目の悪者
[sunarin@localhost work]$ 

フィールドの出力形式を指定する

「-o」オプションを使用することで、フィールドの出力形式を変更できます。-oの後に出力するフィールドを指定します。フィールドを出力したい場合は、「0」を指定します。

ファイル1の列2行目を出力したい場合は、「1.2」と指定します。ファイル番号.列番号の形式で指定します。ファイル2の列2行目を出力したい場合は、「2.2」と指定します。

$ join -o 出力形式 ファイル1 ファイル2

実行結果

[sunarin@localhost work]$ join -o 0 1.2 2.2  comm1.txt comm2.txt 
1 A1 A2
2 B1 B2
3 C1 C2
4 D1 D2
5 E1 E2
[sunarin@localhost work]$