UEC - UNIXを深く理解し、シェルプログラミングを極めるコミュニティサイト

- Tukubaiマニュアル
  - cgi-name(1)
  - check_attr_name(1)
  - check_need_name(1)
  - comma(1)
  - count(1)
  - ctail(1)
  - delf(1)
  - divsen(1)
  - getfirst(1)
  - getlast(1)
  - gyo(1)
  - han(1)
  - join0(1)
  - join1(1)
  - join2(1)
  - juni(1)
  - kasan(1)
  - keta(1)
  - keycut(1)
  - loopj(1)
  - loopx(1)
  - map(1)
  - marume(1)
  - mdate(1)
  - mime-read(1)
  - mojihame(1)
  - nameread(1)
  - plus(1)
  - rank(1)
  - ratio(1)
  - retu(1)
  - self(1)
  - sm2(1)
  - sm4(1)
  - sm5(1)
  - tarr(1)
  - tateyoko(1)
  - tcat(1)
  - unmap(1)
  - up3(1)
  - yarr(1)
  - ycat(1)
  - yobi(1)
  - ysum(1)
  - zen(1)
  - タグ形式(5)
  - ネーム形式(5)
  - フィールド形式(5)

# 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