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)