Tukubaiオンラインコマンドマニュアル - join2(1)

join2(1)

【名前】

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

【書式】

Usage   : join2 [-d<string>|+<string>] key=<key> <master> [<tran>]
Version : Sun Jun 19 23:55:51 JST 2022
Edition : 1

【説明】

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

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

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

キー指定にひとつでも0があると全フィールドを指定したことになる

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: 2022-08-13 08:42:34