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]まで指定できる。

【関連項目】

join1(USP Lab(1))join2(USP Lab(1))

last modified: 2012-04-12 19:49:31