Djoin [ -k key-flags] [ -o output-spec] key-field-list input-file [input-file..]
Djn は Djoinの短縮形(UNIXのみ)。
Djoinは、key-field-listフィールドの値による ジョイン演算を行う。 input-file が一つしか指定されなかった場合、 標準入力が2番目の入力ファイルとして使用される。 入力ファイルは3つ以上あってもよい。 これらは同時にジョインされる。 すべての入力ファイルは、 key-field-list のキー順にソートされていなければならない。 キー順が狂っていると Djoin はエラーメッセージを出して実行終了する。
入力ファイルすべては同時に読み込まれる。 同じキー値を持ったレコードはグループ化され、 これらから以下のように出力レコードが作成される。
上記規則の例示のために、 Dlの定数記法を使用する。
{ a:1 b:2 }
は、次のレコードを意味することにする。
a:1
b:2
すなわち、フィールド"a"の値が1で、フィールド"b"の値が2のDレコードである。
ファイル1が{ k:K a:1 }で、 ファイル2が{ b:1 k:K }、 ファイル3が{ c:1 k:K }のとき、
Djoin k file1 file2 file3
の結果は、次のようになる。
{ k:K a:1 b:1 c:1 }
同一キー値グループ内の入力レコードが1ファイルから複数ある場合、
file1: { k:K a:1 }, { k:K a:2 }
file2: { k:K b:1 }
file3: { k:K c:1 }, { k:K c:2 }
結果は次のようなフィールド構成とレコード順序になる。
{ k:K a:1 b:1 c:1 }
{ k:K a:1 b:1 c:2 }
{ k:K a:2 b:1 c:1 }
{ k:K a:1 b:1 c:2 }
また、 Djoin はジョインするファイルの中に同一フィールド名があるかどうかについて関知しない。 ジョインされるレコード中に(キーフィールド以外で) 同じフィールド名があると、出力レコード中では リピーティングフィールドとなる。 これらのフィールドを区別したい場合、あらかじめリネームしておく必要がある。
標準では、 Djoin はフルマッチのレコードのみ出力する。 (同一キー値のレコードがすべての入力フィルに存在しているグループのみ出力する)。 しかし、 オプション-o output-specによって、 任意の組み合わせのマッチング(アンマッチング)を選択することができる。
Output-spec は文字列で i 番目の文字が i 番目の入力ファイルに対応している。 各文字は次の意味を持つ。
オプション -o は複数あってもよい。 この場合、すべての オプション -oの論理和が取られる。
Key of join is specified with general ジョインするキーはDコマンドの一般 key-field-list として指定する。 2つ以上のフィールドを指定してもよい。 また、数値、大小文字無視、逆順などの指定もできる。
しかし、異なるフィールド名でジョインすることはできない。 ジョインのキーとなるフィールドは Drenameなどによって フィールド名をそろえておかなければならない。
ファイル"countrycode.d"には次のようなレコードが入っている:
countrycode:jp
countryname:Japan
countrycode:us
countryname:United States
ファイル"city.d"には次のようなレコードが入っている:
city:Tokyo
countrycode:jp
city:New York
countrycode:us
...
どちらのファイルも"countrycode"でソートされている。ここで、
Djoin -o 1x countrycode city.d countrycode.d
コマンドは、`city.d'ファイルのレコードに 対応する`countryname'フィールドを付加する。
city:Tokyo
countrycode:jp
countryname:Japan
city:New York
countrycode:us
countryname:United States
...
"countrycode"の値が"countrycode.d"ファイル中にない場合、 "city.d"ファイルのレコードは変更されない。
ファイル"stopwds.d"にはストップワードが次のように入っている。
wd:of
wd:the
...
このファイルはwd:fキー(大小文字の区別をしないアルファベット順) でソートされている。
ファイル"words.d"には、文章中のワードが次のように入っている。
wd:Djoin
wd:joins
wd:the
...
この中からストップワード以外のワードだけを拾う。
Dsort wd:f words.d | Djoin -o 10 wd:f - stopwds.d
二つの入力ファイルから、アンマッチのレコードのみ抽出する。
Djoin -o 10 -o 01 key-filed input-file-1 input-file-2
キーフィールドは空列でもよい。
Djoin "" input-file-1 inpur-file-2
この演算により、input-file-1とinput-file-2の クロスプロダクションが生成される。 ただし、双方のファイルの全レコードを容れられるだけのメモリを必要とするので注意。
マニュアル D_msg参照。
MIYAZAWA Akira