joinコマンドは、共通の列を結合して、それぞれのファイルの列を合わせることができます。
そのため、ファイル間での簡単な表操作に利用することができます。
目次
joinコマンドとは
joinコマンドは、SQLのテーブル間で使われるjoinによく似ています。
ただし、joinコマンドが対象としているのは2つのファイルになります。
joinコマンドを利用することで、簡単な表操作やデータ管理を行うことができます。
joinコマンドの構文
1 |
join [option...] file1 file2 |
標準入力を使用する場合、file1もしくはfile2のどちらか一方で-を使うことで利用できます。
joinコマンドの利用例
共通の列を合わせる
(オプションなし)
それぞれのファイルの1列目を共通の列としてファイルの結合を行います。
列は一つ以上のスペースで区切られます。
また、出力は結合される行が表示されます。
コマンド例
1 |
join name.txt math.txt |
name.txt
1 2 3 4 5 |
ID NAME 1 yamada 2 sato 3 kojima 99 NONE |
math.txt
1 2 3 4 |
ID MATH 1 80 2 30 3 40 |
実行結果
1 2 3 4 |
ID NAME MATH 1 yamada 80 2 sato 30 3 kojima 40 |
表示する列を指定
(-oオプション)
-oオプションを利用することで、表示する列を表示することができます。
-oオプションの書式は、1.1のように記述します。
最初の数字はfile1の場合は1をfile2の場合は2を記述します。
次の数字はそのファイルでの表示する列の位置を記述します。
1.1の場合は、file1の1列目を表示することになります。
コマンド例
1 |
join -o1.2,2.2 name.txt math.txt |
name.txt
1 2 3 4 5 |
ID NAME 1 yamada 2 sato 3 kojima 99 NONE |
math.txt
1 2 3 4 |
ID MATH 1 80 2 30 3 40 |
実行結果
1 2 3 4 |
NAME MATH yamada 80 sato 30 kojima 40 |
共通にする列を指定
(-1オプション等)
-1オプションは、file1でのファイルを結合するときの共通にする列を指定します。
-2オプションは、file2でのファイルを結合するときの共通にする列を指定します。
-jオプションは、file1とfile2で同じ位置の共通にする列を指定します。
コマンド例
1 |
join -12 name.txt japanese.txt |
name.txt
1 2 3 4 5 |
ID NAME 1 yamada 2 sato 3 kojima 99 NONE |
japanese.txt
1 2 3 |
NAME JAPANESE yamada 60 sato 90 |
実行結果
1 2 3 |
NAME ID JAPANESE yamada 1 60 sato 2 90 |
大文字と小文字を区別しない
(-iオプション)
-iオプションを用いると、共通にする列での大文字と小文字の区別しません。
コマンド例
1 |
join -i -12 name.txt science.txt |
name.txt
1 2 3 4 5 |
ID NAME 1 yamada 2 sato 3 kojima 99 NONE |
science.txt
1 2 3 |
NAME SCIENCE YAMADA 60 SATO 90 |
実行結果
1 2 3 |
NAME ID SCIENCE yamada 1 60 sato 2 90 |
ヘッダー行を無視して共通の列を合わせる
(--headerオプション)
--headerオプションは、ヘッダー行を無視してファイルを結合します。
ヘッダー行の名前は異なるが、それぞれの列の意味が同じ場合に使用することができます。
例えば、IDとNO.は違う名前ですが、運用上は同じ意味を指すという状況で使うことができます。
出力に表示するヘッダー行はfile1が優先されます。変更をする場合は-oオプションを利用しましょう。
コマンド例
1 |
join --header name2.txt math.txt |
name2.txt
1 2 3 4 5 6 |
NO. NAMAE 1 yamada 2 sato 2 tanaka 3 kojima 99 NONE |
math.txt
1 2 3 4 |
ID MATH 1 80 2 30 3 40 |
実行結果
1 2 3 4 5 |
NO. NAMAE MATH 1 yamada 80 2 sato 30 2 tanaka 30 3 kojima 40 |
結合できなかった行も表示
(-aオプション)
-aオプションは-a1や-a2のように入力にしているファイルの番号を指定することで、結合できなかった行も表示することができます。
-a1でfile1の結合できなかった行を表示します。
-a2でfile2の結合できなかった行を表示します。
また、-a1と-a2の両方を利用することもできます。
コマンド例
1 |
join -a1 name.txt math.txt |
name.txt
1 2 3 4 5 |
ID NAME 1 yamada 2 sato 3 kojima 99 NONE |
math.txt
1 2 3 4 |
ID MATH 1 80 2 30 3 40 |
実行結果
1 2 3 4 5 |
ID NAME MATH 1 yamada 80 2 sato 30 3 kojima 40 99 NONE |
結合できなかった行のみを表示
(-vオプション)
-vオプションは-v1や-v2のように入力にしているファイルの番号を指定することで、結合できなかった行のみを表示することができます。
-v1でfile1の結合できなかった行を表示します。
-v2でfile2の結合できなかった行を表示します。
また、-v1と-v2の両方を利用することもできます。
コマンド例
1 |
join -v1 name.txt math.txt |
name.txt
1 2 3 4 5 |
ID NAME 1 yamada 2 sato 3 kojima 99 NONE |
math.txt
1 2 3 4 |
ID MATH 1 80 2 30 3 40 |
実行結果
1 |
99 NONE |
区切り文字を指定
(-tオプション)
-tオプションは、入力と出力の区切り文字を指定することができます。
コマンド例
1 |
join -t$'\t' name.tsv math.tsv |
name.tsv
1 2 3 4 5 |
ID NAME 1 yamada 2 sato 3 kojima 99 NONE |
math.tsv
1 2 3 4 |
ID MATH 1 80 2 30 3 40 |
実行結果
1 2 3 4 |
ID NAME MATH 1 yamada 80 2 sato 30 3 kojima 40 |
参考
外部リンクGnu Coreutils
外部リンクGnu Coreutils日本語版