本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、「join」コマンドです。
本連載では、Linuxの基本的なコマンドについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。今回は、2つのテキストファイルを比較して、共通の項目がある行を連結する「join」コマンドです。
「join」は、2つのテキストファイルの内容を比較し、共通する項目がある行を連結するコマンドです。例えば、1つ目のテキストファイルに「100 apple」、2つ目のテキストファイルに「100 リンゴ」という行があった場合、「100 apple リンゴ」と出力します。
データベース(SQL)に慣れ親しんでいる方であれば、「SQLのJOIN」と考えるとイメージしやすいかもしれません。なお、比較するファイルはあらかじめソートされている必要があります。
joinコマンドの主なオプションは次の通りです。
短いオプション | 長いオプション | 意味 |
---|---|---|
-i | --ignore-case | 項目を比較する際に大小文字を区別しない |
-t 区切り文字 | 項目の区切り文字(本文参照) | |
-1 番号 | 1つ目のファイルで比較に使用する項目の番号(左から数えて。無指定時は1番目の項目を使用) | |
-2 番号 | 2つ目のファイルで比較に使用する項目の番号(左から数えて。無指定時は1番目の項目を使用) | |
-j 番号 | 両ファイルで比較に使用する項目の番号(「-j 3」は「-1 3 -2 3」相当) | |
--check-order | 全ての行の組み合わせが一致していても、ソートされているかどうかを確認する | |
--nocheck-order | 入力が正しくソートされているかどうかを確認しない | |
--header | 各ファイルの1行目をヘッダとして扱う | |
短いオプション | 長いオプション | 意味 |
---|---|---|
-a ファイル番号 | 対応するフィールドがない場合も出力する。ファイル番号は1または2で指定(「-a 1」の場合は1つ目のファイルにだけある行も出力) | |
-v ファイル番号 | 対応するフィールドがなかった行だけ出力する | |
-o 出力フィールド | 出力するフィールドを指定する(本文参照) | |
-e 文字列 | 対応するフィールドがない場合に出力する文字列(-j、-1、-2で存在しない項目番号を指定、または「-o」オプションによる出力指定が必要:本文参照) | |
何もオプションがない場合、2つのテキストファイルを比較し、先頭(左から数えて1番目)の項目が共通していたら結合して出力します。例えば、1つ目のテキストファイルに「100 apple」という行があり、2つ目のファイルには「100 リンゴ」という行があった場合は、「100 apple リンゴ」と出力します。
共通しているかどうかの比較に使用する項目は、「-1」および「-2」オプションで変更できます。例えば、1つ目のファイルでは“左から数えて3番目の項目”を使いたい場合、「-1 3」のように指定します。1つ目、2つ目のファイル両方で3番目の項目を使いたい場合は、「-j 3」のように「-j」オプションでまとめて指定することもできます。
join ファイル1 ファイル2
(ファイル1とファイル2を連結する)(画面1)
join -j 3 ファイル1 ファイル2
(ファイル1とファイル2を、3番目の項目を使って連結する)
項目の区切り文字は「-t」オプションで指定します。例えば、CSVファイル(カンマ区切りのファイル)を扱いたい場合は、「-t ,」または「-t ","」のように指定します。
デフォルトの区切り文字は空白文字で、タブ(TAB)も同様に区切りとして認識されます。この場合、出力も空白文字となります。入出力ともにタブにしたい場合も「-t」オプションを使用しますが、「-t "\t"」のような指定ができないため、以下のような方法をとる必要があります。
コマンドラインでタブを入力するには、[Ctrl]+[v]キーに続けて[Tab]キーまたは[Ctrl]+[I]キーを押します(画面2)。シェルスクリプトやシェルの設定ファイルでエイリアスを定義する場合は、エディタでTABを入力してください。
join -t "," ファイル1 ファイル2
(区切り文字を「,」にする)
join -t $'\t' ファイル1 ファイル2
(区切り文字をタブにする(bash/zshの場合))
前述の通り、入力ファイルのタブは“区切り文字”として扱われるので、出力だけを変更したい場合は「tr」コマンド(本連載第52回参照)を使うのが手軽で分かりやすいでしょう。
join -ファイル1 ファイル2 | tr " " "\t"
(出力結果の空白をタブ文字に置き換える)(画面3)
「-a」オプションで、対応する項目がない行も出力することができます。「-a 1」で1つ目のファイル、「-a 2」で2つ目のファイルの行を出力します。対応する項目がない箇所は空白になります。
対応する項目がない箇所に代わりの文字列を出力したい場合は、「-e」オプションを使用します。ただし、「-e」オプションを使用する際には、「-o」オプションで出力内容を指定しておく必要があります。
「-o」オプションでは「ファイル番号.項目番号」で出力する項目を指定します。例えば、1つ目のファイルの2番目の項目と、2つ目のファイルの2番目と3番目の項目であれば「-o 1.2,2.2,2.3」となります。デフォルトの出力でよい場合は「-o auto」と指定します。
join -a 1 ファイル1 ファイル2
(対応する項目がファイル2にない場合はファイル1の行だけ出力する)
join -a 1 -o auto -e "---" ファイル1 ファイル2
(対応する項目がない箇所には「---」を出力する)(画面4)
PC-9801NからのDOSユーザー(LinuxはPC-486DXから)。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。のち退社し、ライターとして活動。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。
Copyright © ITmedia, Inc. All Rights Reserved.