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

join1(1)

【名前】

join1 : トランザクションファイルにマスタファイルを連結(一致した行のみ連結)

【書式】

Usage   : join1 [+ng[<fd>]] key=<n> <master> [<tran>]
Version : Sun Jun 19 23:55:51 JST 2022
Edition : 1

【説明】

tranのkey=<n>で指定したキーフィールドがmasterの第1フィールド(キーフィールド)と一致した行のみtranから抽出して、masterの情報を連結して出力する。連結はtranのキーフィールドの直後にmasterの内容を挿入連結する形で実施される。

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

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

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

+ng <fd>オプションを使うことで、一致した行を標準出力ファイルへ、一致しなかった行をファイルデスクリプタ<fd>のファイルへ出力することが可能。<fd>を省略した場合は標準エラー出力へ出力する。

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

【例1】基本パターン

経費ファイルkeihiからmasterに登録されている4人のデータを抽出し、マスタファイルの内容を連結する。

$ cat master
0000003 杉山______ 26 F
0000005 崎村______ 50 F
0000007 梶川______ 42 F
0000010 柳本______ 50 F
$
$ cat keihi
20070401 0000001 300
20070403 0000001 500
20070404 0000001 700
20070401 0000003 200
20070402 0000003 400
20070405 0000003 600
20070401 0000005 250
20070402 0000005 450
20070402 0000007 210
20070404 0000007 410
20070406 0000007 610
$

keihiの第2フィールドをキーにしてmasterを結合する。masterに存在するキーをもつ行にしか連結を行わない。存在しない行は捨てられる。keihiは同じキーを持つ行が複数行あっても構わない。

$ join1 key=2 master keihi
20070401 0000003 杉山______ 26 F 200
20070402 0000003 杉山______ 26 F 400
20070405 0000003 杉山______ 26 F 600
20070401 0000005 崎村______ 50 F 250
20070402 0000005 崎村______ 50 F 450
20070402 0000007 梶川______ 42 F 210
20070404 0000007 梶川______ 42 F 410
20070406 0000007 梶川______ 42 F 610
$

【例2】

左から順に連続した複数のフィールドをキーに指定する場合は次のように実行する。kekkaファイルの第2フィールド、第2フィールドをキーにして(第2、第3フィールド順に整列されている)masterファイル(第1、第2フィールドの順に整列されている)に存在する行のみ抽出して、masterの内容を連結して出力している。

$ 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
$
$ join1 key=2/3 master kekka
3 A 0000003 杉山______ 26 F 30 50 71 36 30
5 A 0000005 崎村______ 50 F 82 79 16 21 80
6 B 0000007 梶川______ 42 F 50 2  33 15 62
9 C 0000010 柳本______ 50 F 95 60 35 93 76
$

左から順に連続していない複数のフィールドをキーに指定することも可能。この場合は複数のキーフィールドを@でつなげて指定する。なお次の例の場合には、tranは第4、第2フィールドの順に整列され、masterは第3、第1フィールドの順に整列されていることが必要となる。

$ join1 key=4@2 master tran

【例3】"+ng" オプション

masterとキーに一致しない行を抽出することも可能。キーに一致する行は標準出力に、一致しない行は標準エラー出力に出力される。この場合、一致する行はマスタファイルと連結されるが、一致しない行はマスタファイルに存在しないため連結されずそのまま出力されることになる。

$ 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
$

成績ファイルkekkaからmasterに登録されている4名のデータとその他のデータはそれぞれ次のように抽出できる。

$ join1 +ng key=1 master kekka > ok-data 2> ng-data
$ cat ok-data           ← 一致したデータ
0000003 杉山______ 26 F 30 50 71 36 30
0000005 崎村______ 50 F 82 79 16 21 80
0000007 梶川______ 42 F 50 2  33 15 62
0000010 柳本______ 50 F 95 60 35 93 76
$
$ cat ng-data           ← 一致しなかったデータ
0000000 91 59 20 76 54
0000001 46 39 8  5  21
0000004 58 71 20 10 6
0000008 52 91 44 9  0
0000009 60 89 33 18 6
0000011 92 56 83 96 75
$

【関連項目】

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

Last modified: 2022-08-13 08:42:33