「join0」の版間の差分

提供: Personal Tukubai for Academic
ナビゲーションに移動 検索に移動
(Batch Update)
 
(msort にリンクを設定。)
 
(他の1人の利用者による、間の1版が非表示)
19行目: 19行目:
 
トランザクションファイル <tran> の “key=<key>” で指定したキーフィールドが マスターファイル <master> の対応するキーフィールドと マッチした行のみを <tran< から抽出して出力します。
 
トランザクションファイル <tran> の “key=<key>” で指定したキーフィールドが マスターファイル <master> の対応するキーフィールドと マッチした行のみを <tran< から抽出して出力します。
  
<master> の対応するキーフィールドとは、<key> の最小のフィールドが第1フィールドになるように平行移動させたフィールドになります。<key> としては、
+
<master> の対応するキーフィールドとは、<key> の最小のフィールドが第1フィールドになるように平行移動させたフィールドになります。<key> としては、
  
 
<pre>key=3    &lt;tran&gt; の第3フィールド
 
<pre>key=3    &lt;tran&gt; の第3フィールド
key=3/5  &lt;tran&gt; の第3,4,5フィールド(&lt;master&gt; は第1,2,3フィールド)
+
key=3/5  &lt;tran&gt; の第3,4,5フィールド(&lt;master&gt; は第1,2,3フィールド)
key=4@3  &lt;tran&gt; の第4,3フィールド(&lt;master&gt; は第2,1フィールド)
+
key=4@3  &lt;tran&gt; の第4,3フィールド(&lt;master&gt; は第2,1フィールド)
key=NF    &lt;tran&gt; の最終フィールド(&lt;master&gt; は第1フィールド)
+
key=NF    &lt;tran&gt; の最終フィールド(&lt;master&gt; は第1フィールド)
key=NF-3  &lt;tran&gt; の(最終-3)フィールド(&lt;master&gt; は第1フィールド)</pre>
+
key=NF-3  &lt;tran&gt; の(最終-3)フィールド(&lt;master&gt; は第1フィールド)</pre>
が指定できます。更に、 msort のソート種別を指定することができます。
+
が指定できます。更に、 [[msort]] のソート種別を指定することができます。
  
&lt;master&gt; および &lt;tran&gt; のキーフィールドはソート種別に応じてソートされていることが必要です。更に &lt;master&gt; は、キーフィールドについて、各レコードがユニークでなければなりません。(キーフィールドが同じ値を持つレコードが複数あってはなりません)&lt;tran&gt; についてはこの制約は無く、キーフィールドが同じ値を持つレコードが有っても構いません。
+
&lt;master&gt; および &lt;tran&gt; のキーフィールドはソート種別に応じてソートされていることが必要です。更に &lt;master&gt; は、キーフィールドについて、各レコードがユニークでなければなりません。(キーフィールドが同じ値を持つレコードが複数あってはなりません)&lt;tran&gt; についてはこの制約は無く、キーフィールドが同じ値を持つレコードが有っても構いません。
  
 
マッチしない行は破棄しますが、+ng オプションを指定すると、ファイルデスクリプタ &lt;fd&gt; へ出力します。&lt;fd&gt; を省略した場合は標準エラー出力へ出力します。
 
マッチしない行は破棄しますが、+ng オプションを指定すると、ファイルデスクリプタ &lt;fd&gt; へ出力します。&lt;fd&gt; を省略した場合は標準エラー出力へ出力します。
38行目: 38行目:
 
基本パターン
 
基本パターン
  
成績ファイル kekka から master に登録されている4人のデータを抽出し ます。
+
成績ファイル kekka から master に登録されている4人のデータを抽出し ます。
  
<pre>(マスターファイル:master)
+
<pre>(マスターファイル:master)
 
$ cat master
 
$ cat master
 
0000003 杉山______ 26 F
 
0000003 杉山______ 26 F
47行目: 47行目:
 
0000010 柳本______ 50 F
 
0000010 柳本______ 50 F
  
(トランザクションファイル:kekka)
+
(トランザクションファイル:kekka)
 
$ cat kekka
 
$ cat kekka
 
A 0000000 91 59 20 76 54
 
A 0000000 91 59 20 76 54
59行目: 59行目:
 
A 0000010 95 60 35 93 76
 
A 0000010 95 60 35 93 76
 
A 0000011 92 56 83 96 75</pre>
 
A 0000011 92 56 83 96 75</pre>
kekka の第2フィールドが master ファイルに存在する行のみ抽出
+
kekka の第2フィールドが master ファイルに存在する行のみ抽出
  
 
<pre>$ join0 key=2 master kekka &gt; data
 
<pre>$ join0 key=2 master kekka &gt; data
71行目: 71行目:
 
左から順に連続した複数のフィールドをキーに指定する場合です。
 
左から順に連続した複数のフィールドをキーに指定する場合です。
  
<pre>(マスター:master)
+
<pre>(マスター:master)
 
$ cat master
 
$ cat master
 
A 0000003 杉山______ 26 F
 
A 0000003 杉山______ 26 F
78行目: 78行目:
 
C 0000010 柳本______ 50 F
 
C 0000010 柳本______ 50 F
  
(トランザクション:kekka)
+
(トランザクション:kekka)
 
$ cat kekka
 
$ cat kekka
 
01 A 0000000 91 59 20 76 54
 
01 A 0000000 91 59 20 76 54
109行目: 109行目:
 
<pre>$ join0 +ng3 key=&lt;key&gt; &lt;master&gt; &lt;tran&gt; &gt; ok-data 3&gt; ng-data
 
<pre>$ join0 +ng3 key=&lt;key&gt; &lt;master&gt; &lt;tran&gt; &gt; ok-data 3&gt; ng-data
  
(マスターファイル:master)
+
(マスターファイル:master)
 
$ cat master
 
$ cat master
 
0000003 杉山______ 26 F
 
0000003 杉山______ 26 F
116行目: 116行目:
 
0000010 柳本______ 50 F
 
0000010 柳本______ 50 F
  
(トランザクションファイル:kekka)
+
(トランザクションファイル:kekka)
 
$ cat kekka
 
$ cat kekka
 
0000000 91 59 20 76 54
 
0000000 91 59 20 76 54
131行目: 131行目:
  
 
<pre>$ join0 +ng3 key=1 master kekka &gt; ok-data 3&gt; ng-data
 
<pre>$ join0 +ng3 key=1 master kekka &gt; ok-data 3&gt; ng-data
$ cat ok-data  #(マッチしたデータ)
+
$ cat ok-data  #(マッチしたデータ)
 
0000003 30 50 71 36 30
 
0000003 30 50 71 36 30
 
0000005 82 79 16 21 80
 
0000005 82 79 16 21 80
 
0000007 50 2  33 15 62
 
0000007 50 2  33 15 62
 
0000010 95 60 35 93 76
 
0000010 95 60 35 93 76
$ cat ng-data  #(マッチしなかったデータ)
+
$ cat ng-data  #(マッチしなかったデータ)
 
0000000 91 59 20 76 54
 
0000000 91 59 20 76 54
 
0000001 46 39 8  5  21
 
0000001 46 39 8  5  21
163行目: 163行目:
  
 
<pre>$ join0 +ng3 key=1 master tran &gt; /dev/null 3&gt; ng-data</pre>
 
<pre>$ join0 +ng3 key=1 master tran &gt; /dev/null 3&gt; ng-data</pre>
&lt;tran&gt; または &lt;master&gt; を読み終わったあと、他方についても最後まで読む(読み捨てる)ので、パイプの目詰まりを起こさないように作られています。
+
&lt;tran&gt; または &lt;master&gt; を読み終わったあと、他方についても最後まで読む(読み捨てる)ので、パイプの目詰まりを起こさないように作られています。
  
 
<pre>$ cat bigfile | join0 key=1 master &gt; ok-data</pre>
 
<pre>$ cat bigfile | join0 key=1 master &gt; ok-data</pre>
key=&lt;key&gt; 引数と -e/-s&lt;c&gt; オプションは msort と同じです。
+
key=&lt;key&gt; 引数と -e/-s&lt;c&gt; オプションは [[msort]] と同じです。
  
 
== Version and Edition ==
 
== Version and Edition ==
178行目: 178行目:
  
 
© 2021 Universal Shell Programming Laboratory [https://www.usp-lab.com/ site]
 
© 2021 Universal Shell Programming Laboratory [https://www.usp-lab.com/ site]
 
  
  
 
[[Category:man]]
 
[[Category:man]]

2022年3月19日 (土) 03:40時点における最新版

名前

join0 : マスターにキーフィールドがマッチする行を抽出する

書式

使い方とオプション

Usage

join0 key=<key> <master> <tran>

Option

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

説明

トランザクションファイル <tran> の “key=<key>” で指定したキーフィールドが マスターファイル <master> の対応するキーフィールドと マッチした行のみを <tran< から抽出して出力します。

<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 のソート種別を指定することができます。

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

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

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

例(その1)

基本パターン

成績ファイル kekka から master に登録されている4人のデータを抽出し ます。

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

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

kekka の第2フィールドが master ファイルに存在する行のみ抽出

$ join0 key=2 master kekka > data
$ cat data
A 0000003 30 50 71 36 30
A 0000005 82 79 16 21 80
A 0000007 50 2  33 15 62
A 0000010 95 60 35 93 76

例(その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 に存在する行のみ抽出して出力

$ join0 key=2/3 master kekka > data
$ cat data
03 A 0000003 30 50 71 36 30
05 A 0000005 82 79 16 21 80
06 B 0000007 50 2  33 15 62
09 C 0000010 95 60 35 93 76

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

$ join0 key=3@2 master kekka > data

例(その3)

+ng オプション

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

$ join0 +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人のデータとその他のデータをそれぞれ抽出します。

$ join0 +ng3 key=1 master kekka > ok-data 3> 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

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

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

例(その4)

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

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

備考

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

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

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

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

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

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

$ cat bigfile | join0 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