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]$