Tukubaiオンラインコマンドマニュアル

join2(1)

【名前】

join2 : トランザクションファイルマスタファイルを連結(一致しなかった行はダミーデータへ置換)

【書式】

Usage	: join2 [-d<string>] [+<string>] key=<key> <master> <tran>
Version	: Thu Dec 15 13:46:38 JST 2011

【説明】

tranのkey=<n>で指定したキーフィールドがmasterの第1フィールド(キーフィールド)と一致した行をtranから抽出し、masterの情報を連結して出力する。一致しない行はダミーデータ*を連結して出力する。ダミーデータは-dオプションにて指定できる。

masterに-を指定すると標準入力をマスタファイルとする。tranが無指定かまたは-が指定されている場合には、標準入力がトランザクションファイルとなる。

masterの第1フィールドおよびtranの第<n>フィールドは必ず昇順で整列されていることが条件となる。また、masterはキーフィールド(第1フィールド)がユニークでなければならない(第1フィールドが同じ値を持つ行が複数あってはならない)。tranについてはこの制約はなく、キーフィールド(第<n>フィールド)が同じ値の行はいくつあっても構わない。

masterの第1フィールドおよびtranの第<n>フィールドは必ず昇順で整列されていることが条件となる。また、masterのキーフィールド(第1フィールド)はユニークでなければならない。(第1フィールドが同じ値をもつ行が複数あってはならない)。tranについてはこの制約はなく、キーフィールド(第<n>フィールド)が同じ値を行はいくつあっても構わない。

tranでキーが整列されていないものはjoin2(1)では処理できない。その場合は一旦tranを整列してからjoin2(1)で処理するか、join2(1)のかわりにcjoin2(1)を使って処理すればよい。

【例1】基本パターン

$ cat master
0000003 杉山______ 26 F
0000005 崎村______ 50 F
0000007 梶川______ 42 F
0000010 柳本______ 50 F
$ 
$ cat kekka
0000000 91 59 20 76 54
0000001 46 39 8  5  21
0000003 30 50 71 36 30
0000004 58 71 20 10 6
0000005 82 79 16 21 80
0000007 50 2  33 15 62
0000008 52 91 44 9  0
0000009 60 89 33 18 6
0000010 95 60 35 93 76
0000011 92 56 83 96 75
$ 

masterに存在しない行は次のように*で補完して出力される。

$ join2 key=1 master kekka
0000000 ********** ** * 91 59 20 76 54
0000001 ********** ** * 46 39 8  5  21
0000003 杉山______ 26 F 30 50 71 36 30
0000004 ********** ** * 58 71 20 10 6
0000005 崎村______ 50 F 82 79 16 21 80
0000007 梶川______ 42 F 50 2  33 15 62
0000008 ********** ** * 52 91 44 9  0
0000009 ********** ** * 60 89 33 18 6
0000010 柳本______ 50 F 95 60 35 93 76
0000011 ********** ** * 92 56 83 96 75
$ 

【例2】

左から順に連続した複数のフィールドをキーに指定する場合次のようになる。第2、第3フィールドでキーが一致するかどうかをチェックしている。

$ cat master
A 0000003 杉山______ 26 F
A 0000005 崎村______ 50 F
B 0000007 梶川______ 42 F
C 0000010 柳本______ 50 F
$ 
$ cat kekka
1 A 0000000 91 59 20 76 54
2 A 0000001 46 39 8  5  21
3 A 0000003 30 50 71 36 30
4 A 0000004 58 71 20 10 6
5 A 0000005 82 79 16 21 80
6 B 0000007 50 2  33 15 62
7 B 0000008 52 91 44 9  0
8 C 0000009 60 89 33 18 6
9 C 0000010 95 60 35 93 76
10 C 0000011 92 56 83 96 75
$ 
$ join2 key=2/3 master kekka
1 A 0000000 ********** ** * 91 59 20 76 54
2 A 0000001 ********** ** * 46 39 8  5  21
3 A 0000003 杉山______ 26 F 30 50 71 36 30
4 A 0000004 ********** ** * 58 71 20 10 6
5 A 0000005 崎村______ 50 F 82 79 16 21 80
6 B 0000007 梶川______ 42 F 50 2  33 15 62
7 B 0000008 ********** ** * 52 91 44 9  0
8 C 0000009 ********** ** * 60 89 33 18 6
9 C 0000010 柳本______ 50 F 95 60 35 93 76
10 C 0000011 ********** ** * 92 56 83 96 75
$ 

【例3】

+<string>はダミーデータとして補完する文字を指定するオプション。+の後に補完で使用する文字を指定する。

$ cat master
0000003 杉山______ 26 F
0000005 崎村______ 50 F
0000007 梶川______ 42 F
0000010 柳本______ 50 F
$ 
$ cat kekka
0000000 91 59 20 76 54
0000001 46 39 8  5  21
0000003 30 50 71 36 30
0000004 58 71 20 10 6
0000005 82 79 16 21 80
0000007 50 2  33 15 62
0000008 52 91 44 9  0
0000009 60 89 33 18 6
0000010 95 60 35 93 76
0000011 92 56 83 96 75
$ 
$ join2 +@ key=1 master kekka
0000000 @ @ @ 91 59 20 76 54
0000001 @ @ @ 46 39 8  5  21
0000003 杉山______ 26 F 30 50 71 36 30
0000004 @ @ @ 58 71 20 10 6
0000005 崎村______ 50 F 82 79 16 21 80
0000007 梶川______ 42 F 50 2  33 15 62
0000008 @ @ @ 52 91 44 9  0
0000009 @ @ @ 60 89 33 18 6
0000010 柳本______ 50 F 95 60 35 93 76
0000011 @ @ @ 92 56 83 96 75
$ 

【備考】

masterが0バイトの時は何も連結せずtranそのものを出力する。

$ : > master
$ join2 key=1 master tran > data
$ cmp tran data		←同じデータが出力される

masterのフィールドを保証したい時は、例えば次のようなコードを書く。

$ [ ! -s master ] && echo 0000000 0 > master
$ join2 key=1 master tran

【関連項目】

cjoin0(1)cjoin1(1)cjoin2(1)join0(1)join1(1)loopj(1)loopx(1)up3(1)マスタファイル(5)トランザクションファイル(5)

last modified: 2014-01-13 16:01:13