Djoin - キーフィールド値によるDファイルのジョイン・マッチング

形式

Djoin [ -k key-flags] [ -o output-spec] key-field-list input-file [input-file..]

DjnDjoinの短縮形(UNIXのみ)。

説明

Djoinは、key-field-listフィールドの値による ジョイン演算を行う。 input-file が一つしか指定されなかった場合、 標準入力が2番目の入力ファイルとして使用される。 入力ファイルは3つ以上あってもよい。 これらは同時にジョインされる。 すべての入力ファイルは、 key-field-list のキー順にソートされていなければならない。 キー順が狂っていると Djoin はエラーメッセージを出して実行終了する。

マッチング

入力ファイルすべては同時に読み込まれる。 同じキー値を持ったレコードはグループ化され、 これらから以下のように出力レコードが作成される。

  1. グループに各入力ファイルからゼロまたは1レコードづつしかない場合、 出力レコードは1つだけ作成される。 このレコードにはグループの最初のレコードの全フィールドに、 グループの2番目のレコードからキーフィールドを除く全フィールドが続き、 グループの3番目のレコードから…、と同様に続く。
  2. グループに、ある一つの入力ファイルから複数のレコードがあった場合、 これらのレコードの、ケース1と同様のフィールド構成を持つ直積が 作成され、それらが出力される。 直積の各レコードの出力順は、 「下位レコードが先に変化する」という規則による。

上記規則の例示のために、 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 番目の入力ファイルに対応している。 各文字は次の意味を持つ。

1
マッチ: 出力レコードとして対応する入力ファイルからの入力があったグループが選択される。
0
アンマッチ: 出力レコードとして対応する入力ファイルからの入力がなかったグループが選択される。
x
DON'T CARE: そのファイルからの入力レコードの有無は関係しない。

オプション -o は複数あってもよい。 この場合、すべての オプション -oの論理和が取られる。

キーフィールド

Key of join is specified with general ジョインするキーはDコマンドの一般 key-field-list として指定する。 2つ以上のフィールドを指定してもよい。 また、数値、大小文字無視、逆順などの指定もできる。

しかし、異なるフィールド名でジョインすることはできない。 ジョインのキーとなるフィールドは Drenameなどによって フィールド名をそろえておかなければならない。

オプション

-k key-flags
key-field-list の省略時のキーフラグ値を与える。 この値は、 key-field-list のエントリにフラグが指定されていない場合に効力を持つ。 マニュアル Dintro参照。
-o output-spec
マッチングパターンによる出力レコードの選択。 output-spec の文字数がが入力ファイルの数より少ない意場合、 後のファイルにはDO'NT CAREが仮定される。
また、DON'T CAREでは x, のかわりに、1または0以外のどんな文字を使ってもよい。 ただ、読みやすさを考慮して x の使用を推奨する。

使用例

コードテーブル参照

ファイル"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参照。

参照

DintroDpasteDsortD_msg

AUTHOR

MIYAZAWA Akira


miyazawa@nii.ac.jp
2003