サイト内検索:

join1

名前

join1 : トランザクションファイルにマスターファイルを連結する

(キーフィールドがマッチする行のみ抽出)

書式

使い方とオプション

Usage

join1 key=<key> <master> <tran>

Option

+ng[<fd>]
-e
-s<c>

説明

トランザクションファイル <tran> の “key=<key>” で指定したキーフィールドが マスターファイル <master> の対応するキーフィールドとマッチした行のみを <tran> から抽出して、<master> の情報を連結して出力します。連結は <tran> のキーフィールドの直後に <master> の内容を挿入する形で行われます。

<master> の対応するキーフィールドとは、<key> の最小のフィールドが第1フィールドになるように平行移動させたフィールドになります。<key> としては、

key=3     <tran> の第3フィールド
key=3/5   <tran> の第3,4,5フィールド(<master> は第1,2,3フィールド)
key=4@3   <tran> の第4,3フィールド(<master> は第2,1フィールド)
key=NF    <tran> の最終フィールド(<master> は第1フィールド)
key=NF-3  <tran> の(最終-3)フィールド(<master> は第1フィールド)

が指定できます。更に、msort(USP) のソート種別を指定することができます。

<master> および <tran> のキーフィールドはソート種別に応じてソートされていることが必要です。更に <master> は、キーフィールドについて、各レコードがユニークでなければなりません。(キーフィールドが同じ値を持つレコードが複数あってはなりません)<tran> についてはこの制約は無く、キーフィールドが同じ値を持つレコードが有っても構いません。

マッチしない行は破棄しますが、+ng オプションを指定すると、ファイルデスクリプタ へ出力します。<fd> を省略した場合は標準エラー出力へ出力します。

<master> に “-” を指定すると標準入力から読み込みます。<tran> が無指定、あるいは “-” を指定すると標準入力から読み込みます。<master> と<tran> の両方が標準入力の場合はエラーになります。

例(その1)

基本パターン

経費ファイル keihi から master に登録されている4人のデータを抽出し、master の内容を連結します。

(マスターファイル:master)
$ cat master
0000003 杉山______ 26 F
0000005 崎村______ 50 F
0000007 梶川______ 42 F
0000010 柳本______ 50 F

(トランザクションファイル:keihi)
$ cat keihi
20070401 0000001 300
20070403 0000001 500
20070404 0000001 700
20070401 0000003 200
20070402 0000003 400
20070405 0000003 600
20070401 0000005 250
20070402 0000005 450
20070402 0000007 210
20070404 0000007 410
20070406 0000007 610

keihi の第2フィールドをキーにして master を結合

$ join1 key=2 master keihi > data
$ cat data
20070401 0000003 杉山______ 26 F 200
20070402 0000003 杉山______ 26 F 400
20070405 0000003 杉山______ 26 F 600
20070401 0000005 崎村______ 50 F 250
20070402 0000005 崎村______ 50 F 450
20070402 0000007 梶川______ 42 F 210
20070404 0000007 梶川______ 42 F 410
20070406 0000007 梶川______ 42 F 610

例(その2)

左から順に連続した複数のフィールドをキーに指定する場合です。

(マスター:master)
$ cat master
A 0000003 杉山______ 26 F
A 0000005 崎村______ 50 F
B 0000007 梶川______ 42 F
C 0000010 柳本______ 50 F

(トランザクション:kekka)
$ cat kekka
01 A 0000000 91 59 20 76 54
02 A 0000001 46 39 8  5  21
03 A 0000003 30 50 71 36 30
04 A 0000004 58 71 20 10 6
05 A 0000005 82 79 16 21 80
06 B 0000007 50 2  33 15 62
07 B 0000008 52 91 44 9  0
08 C 0000009 60 89 33 18 6
09 C 0000010 95 60 35 93 76
10 C 0000011 92 56 83 96 75

kekka の第2フィールド、第3フィールドをキーにして、master に存在する行のみ抽出して、master の内容を連結して出力

$ join1 key=2/3 master tran > data
$ cat data
03 A 0000003 杉山______ 26 F 30 50 71 36 30
05 A 0000005 崎村______ 50 F 82 79 16 21 80
06 B 0000007 梶川______ 42 F 50 2  33 15 62
09 C 0000010 柳本______ 50 F 95 60 35 93 76

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

$ join1 key=3@2 master kekka > data

例(その3)

“+ng” オプション

マッチしないレコードを抽出することもできます。

$ join1 +ng3 key=<key> <master> <tran> > ok-data 3> ng-data

(マスターファイル:master)
$ cat master
0000003 杉山______ 26 F
0000005 崎村______ 50 F
0000007 梶川______ 42 F
0000010 柳本______ 50 F

(トランザクションファイル:kekka)
$ 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人のデータとその他のデータをそれぞれ抽出します。

$ cat ok-data        #(マッチしたデータ)(master が連結されている)
0000003 杉山______ 26 F 30 50 71 36 30
0000005 崎村______ 50 F 82 79 16 21 80
0000007 梶川______ 42 F 50 2  33 15 62
0000010 柳本______ 50 F 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

<fd> を省略すると、マッチしないレコードは標準エラー出力へ出力します。

$ join1 +ng key=1 master kekka > ok-data 2> ng-data

例(その4)

ファイル名を “-” にすることにより、標準入力から <master> や <tran> を読むことができます。<tran> の “-” を省略した場合も標準入力から<tran> を読みます。

$ cat master | join1 key=1 - tran
$ cat tran | join1 key=1 master -
$ cat tran | join1 key=1 master      # "-" を省略できます。

備考

“+ng” オプションのコメント

アンマッチのデータをパイプで次のコマンドへつなぐ場合は次の様に記述します。

$ join1 +ng3 key=1 master tran 3>&1 1> ok-data  |  次のコマンド

アンマッチのデータのみ出力したい場合は、マッチデータは /dev/null へ出力します。

$ join1 +ng3 key=1 master tran > /dev/null 3> ng-data

<tran> または <master> を読み終わったあと、他方についても最後まで読む(読み捨てる)ので、パイプの目詰まりを起こさないように作られています。

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

key=<key> 引数と -e/-s<c> オプションは msort と同じです。

Version and Edition

Version : Thu Jan 14 11:01:02 JST 2021

Edition : 1


© 2021 Universal Shell Programming Laboratory site

戻る