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

join0(1)

【名前】

join0 : マスタファイルにキーフィールドが一致するトランザクションファイルの行を抽出

【書式】

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

キーに選択するフィールドは複数指定することもできる。たとえばkey=3/5のように指定した場合、tranの第3、第4、第5フィールドを意味するようになる。またこの場合、masterのキーは第1、第2、第3フィールドとなる。いずれも、指定したkeyについてmasterもtranも整列されている必要がある。

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

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

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

【例1】基本パターン

成績ファイルkekkaからmasterに登録されている4人のデータを抽出する。

$ 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の第1フィールドがmasterファイルに存在する行のみ抽出する。

$ join0 key=1 master kekka
0000003 30 50 71 36 30
0000005 82 79 16 21 80
0000007 50 2  33 15 62
0000010 95 60 35 93 76
$

【例2】

左から順に複数のフィールドに連続するキーを指定できる。例えばmasterファイルに第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
$
$ join0 key=2/3 master kekka > data
3 A 0000003 30 50 71 36 30
5 A 0000005 82 79 16 21 80
6 B 0000007 50 2  33 15 62
9 C 0000010 95 60 35 93 76
$

左から順に連続していない複数のフィールドをキーに指定することも可能。この場合は複数のキーフィールドを@でつなげて指定する。

$ join0 key=3@1 master tran

【例3】+ngオプション

masterとキーが一致しない"tran"の行を抽出することも可能。キーに一致する行は標準出力に、一致しない行は標準エラー出力に出力される。

$ 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人のデータと、その他のデータとをそれぞれ抽出する。

$ join0 +ng key=1 master kekka > ok-data 2> ng-data
$ cat ok-data           ←一致したデータ
0000003 30 50 71 36 30
0000005 82 79 16 21 80
0000007 50 2  33 15 62
0000010 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
$

【例4】

ファイル名を-にすることにより標準入力からmasterやtranを読むことができる。join1(1)join2(1)も同様。tranの-を省略した場合も標準入力からtranを読み込む。

$ cat master | join0 key=1 - tran
$ cat tran | join0 key=1 master -
$ cat tran | join0 key=1 master         ←-を省略可能

【コラム1】+ngオプションのコメント - join1(1)も同様

不一致のデータをパイプで次のコマンドへつなぐ場合は次のように記述する。

$ join0 +ng key=1 master tran 2>&1 1> ok-data |  次のコマンド

不一致のデータのみ出力したい場合には、一致データを/dev/nullへ出力させれば良い。

$ join0 +ng key=1 master tran > /dev/null 2> ng-data

【コラム2】

join0(1)およびjoin1(1)はmasterと同じキーフィールドを持つtranの行を出力するが、パイプの目詰まりを起こさないようにmasterを読み終わったあと読み残したtranについても最後まで読むように動作する。

$ cat bigfile | join0 key=1 master > ok-data

【備考】

keyのフィールドは合わせて128フィールドが最大で、1キーフィールドあたり最大256[byte]まで指定できる。

【関連項目】

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

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