[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.3 join: 共通のフィールドに基づいて行を結合する

join は、二つの入力ファイルを対象に、同一の共通フィールド (join field) を持つことで「対」になっている各行を、 1 行にまとめて、標準出力に書き出す。

書式:

 
join [option]… file1 file2

file1file2 の片方は ‘-’、すなわち標準入力であってもよい (両方とも標準入力は不可)。file1file2 は、 共通フィールドに基づいてソートされているべきである。

通常、ソート順は、LC_COLLATE のロケールが規定している照合順序である。 ‘-t’ オプションが指定されていない場合は、両ファイルについて並び方を比較する際、 sort -b の場合と同様に、共通フィールドの先頭にある空白が無視される。 また、‘--ignore-case’ が指定されている場合は、 sort -f と同様、共通フィールドでアルファベットの大文字と小文字は区別されない。

sort の出力を join に渡すなら、sortjoin が使用するロケールやオプションは首尾一貫していなければならない。 ‘sort -k 1b,1’ のようなコマンドを使用すれば、 デフォルトの共通フィールドに基づいて、ファイルをソートすることができる。 しかし、ロケール、共通フィールド、区切り記号、比較オプションなどにデフォルト以外のものを使用する場合は、 joinsort の間で矛盾が起きないように、そうしたものを選択しなければならないのだ。 ‘join -t ''’ が指定された場合は、行全体が共通フィールドとして考慮の対象になるが、 これは、sort のデフォルトの動作に対応している。

入力のすべての行が対になっている場合は、GNU による拡張が利用できる。 この場合、並んでいる順番は、対になる二つのフィールドが同じであると判断されるならば、どんな順番でもよい。 ただし、並び方の比較を上述のように行ったとき、二つのフィールドが同じだと判断される場合であり、 その場合のみである。例を挙げよう。

 
$ cat file1
a a1
c c1
b b1
$ cat file2
a a2
c c2
b b2
$ join file1 file2
a a1 a2
c c1 c2
b b1 b2

--check-order’ を指定した場合、入力がソートされていないと、 エラーメッセージを出して、実行を中断する。‘--nocheck-order’ オプションを指定した場合は、入力がソートされていなくても、エラーメッセージを出すことはない。 どちらのオプションも指定されていない場合に、入力がソートされていないとの診断を下すのは、 片方の入力ファイルにもう一方と対にならない行が見つかったときだけであり、 それも入力ファイルのどちらも空ではなく、中身を持っているときだけである。 入力ファイルがソートされていないと診断すると、join は 0 以外のステータスで終了する (従って、そうした出力は使用するべきではない)。

入力ファイルがきちんとソートされていず、しかも、対にならない行を含む場合に、 ‘--nocheck-order’ を指定して、そうしたファイルを join で無理矢理処理しても、何か特定の結果をもたらすことは保証できない。 おそらく出力は、期待に添わないものになるだろう。

デフォルトの動作は次のようになっている。

このプログラムでは以下のオプションが使用できる。参照: 共通オプション.

-a file-number

file-number (‘1’ か ‘2’) のファイルに、もう一方のファイルと対にならない行がある場合、 通常の出力のほかに、その行も表示する。

--check-order

入力ファイルのどちらかの内容がきちんとソートされていないと、 エラーメッセージを出して、実行に失敗する。

--nocheck-order

入力ファイルの内容がソートされた順番になっているかどうかを、 どちらのファイルについてもチェックしない。これが、デフォルトである。

-e string

入力では欠けているフィールドを、出力では string で補う。 すなわち、オプション ‘-1’, ‘-2’, ‘-j’, ‘-o’ などを指定したときに、欠けているフィールドがそれに当たる。

--header

各入力ファイルの最初の行をヘッダ行と見なす。ヘッダ行も結合され、 最初の出力行として表示される。‘-o’ を使って、出力フォーマットを指定している場合は、 ヘッダ行もそのフォーマットに従って出力される。 ヘッダ行は、‘--check-order’ が指定されていても、並び順のチェックを受けない。 なお、両ファイルのヘッダ行がマッチしない場合は、 一番目のファイルのヘッダ・フィールドが使用される。

-i
--ignore-case

キーを比較する際、アルファベットの大文字小文字を区別しない。 このオプションを使用するときは、 両方の入力ファイルの行が、同じように大文字小文字を区別せず並んでいなければならない。 そうした順番で並べるには、‘sort -f’ を使えばよい。

-1 field

ファイル 1 では field 番目のフィールドを共通フィールドとする (field は正の整数)。

-2 field

ファイル 2 では field 番目のフィールドを共通フィールドとする (field は正の整数)。

-j field

-1 field -2 field’ と等価。

-o field-list
-o auto

キーワードの ‘auto’ が指定されると、 join は各ファイルの最初の行を元にして、出力フォーマットを推測する。 それは、デフォルトの出力フォーマットとほぼ同じだが、 それだけでなく、各行に必ず同数のフィールドを出力するようにする。 また、欠けているフィールドがあれば、‘-e’ オプションの指定する文字列で補う。 余分なフィールドは除去する。

auto’ が指定されていない場合は、field-list のフォーマットに従って、 各出力行を構成する。field-list の各要素は、‘0’ 一文字か、m.n という形を取る。ここで、m はファイル番号 (file-number) であり、‘1’ か ‘2’ である。n はフィールド番号であり、正の整数である。

0’ というフィールド指定は、共通フィールドを指している。ほとんどの場合、 ‘0’ というフィールド指定と同じことが、共通フィールドを明示的に m.n で示すことでも、実現できるだろう。しかしながら、(‘-a’ オプションなり ‘-v’ オプションなりを使用して)、対にならない行を表示する場合、 対にならない行が両方のファイルに存在すると、field-listm.n をどう使おうとも、共通フィールドを指定できないのだ。join で共通フィールドの指定が常に可能になるように、POSIX は ‘0’ というフィールド指定法を考案したのである。

field-list の各要素は、コンマ、または空白で区切られる。 区切りに空白を使用するときは、シェルによって解釈されないように、 たいていの場合引用符で囲む必要がある。たとえば、コマンド ‘join -o 1.2,2.2’ と ‘join -o '1.2 2.2'’ は、同じ動作になる。

field-list の指定は、すべての出力行に適用される。これは、‘-a’ や ‘-v’ オプションによって出力されるものにも当てはまる。

-t char

入出力のフィールドの区切りに、文字 char を使用する。 char は、入力ファイルに現れる一つ一つが、有意なものとして扱われる。 ‘sort -t char’ を ‘-b’ なしで実行すれば、 このオプションに対応する順序に行を並べることができる。 ‘join -t ''’ を指定すると、行全体が共通フィールドとして考慮の対象になり、 これは sort のデフォルトの動作に対応している。 ‘-t '\0'’ を指定すると、ASCII NUL 文字がフィールドの区切りに使用される。

-v file-number

通常の出力はせず、file-number (‘1’ か ‘2’ である) のファイルに存在する、対にならない各行を表示する。

-z
--zero-terminated

項目の区切りに、改行 (ASCII LF) ではなく、ゼロバイトを使用する。 すなわち、入力を ASCII NUL で分離された項目として扱い、出力する各項目の末尾に ASCII NUL を付加する。このオプションは、‘perl -0’, ‘find -print0’, ‘xargs -0’ などと組み合わせて使用すると、 便利なことがある。そうしたコマンドでも、わがままなファイル名を (空白などの特殊文字を含んでいる場合でも) きちんと確実に処理するために、 同様なことをしているのである。 ‘-z’ オプションを使用した場合、改行文字はフィールド・セパレータ扱いになる。

終了ステータス 0 は成功を示し、0 以外の値は失敗を示す。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

This document was generated on June 7, 2022 using texi2html 1.82.