Tukubaiオンラインコマンドマニュアル
join0(USP Lab(1))
【名前】
join0 : マスターにキーフィールドが一致する行を抽出
【書式】
Usage : join0 [+ng[<fd>]] key=<n> <master> <tran> Version : Thu Dec 15 13:46:38 JST 2011
【説明】
テキストファイルtranのkey=<n>で指定したキーフィールドがマスターファイルmasterの第1フィールド(キーフィールド)と一致した行のみtranから抽出して出力する。
masterの第1フィールドおよびtranの第<n>フィールドは必ず昇順で整列されていることが条件となる。さらに、masterについてはキーフィールド(第1フィールド)について、各行がユニークでなければならない(第1フィールドが同じ値をもつ行が複数あってはならない)。tranについてはこの制約はなく、キーフィールド(第<n>フィールド)が同じ値を行はいくつあっても構わない。
キーに選択するフィールドは複数指定することも可能。
+ng オプションをつけると、一致した行を標準出力ファイルへ、一致しなかった行をファイルデスクリプタ<fd>のファイルへ出力する。<fd>を省略した場合は標準エラー出力ファイルへ出力する。
【例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(USP Lab(1))やjoin2(USP Lab(1))も同様。tranの-を省略した場合も標準入力からtranを読み込む。
$ cat master | join0 key=1 - tran
$ cat tran | join0 key=1 master -
$ cat tran | join0 key=1 master ←-を省略可能
【コラム1】+ngオプションのコメント - join1(USP Lab(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(USP Lab(1))およびjoin1(USP Lab(1))はmasterと同じキーフィールドを持つtranの行を出力するが、パイプの目詰まりを起こさないようにmasterを読み終わったあと読み残したtranについても最後まで読むように動作する。
$ cat bigfile | join0 key=1 master > ok-data
【備考】
keyのフィールドは合わせて128フィールドが最大で、1キーフィールドあたり最大256[byte]まで指定できる。