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> へ出力します。<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