基本コマンド編:レコードの併合(xtcat)

これまでの章では、一つの入力ファイルに対して処理を行ってきたが、実際には、大量データは月別や日別、もしくは店別などのファイルに分けて保存されていることが多い。そこでxtcatコマンドは、複数の入力ファイルの全レコードを併合する。


ここでは、先に作成したスクリプトxtagg.shを再利用することにする。xtagg.shをxtcat.shの名前でコピーしておこう。

新しくコピーされたファイル"xtcat.sh"を編集する。入力ファイルを併合するので、スクリプトの先頭にxtcatコマンドを挿入する。
xtcatコマンドでは、併合したい複数ファイルを"-i"オプションでカンマで区切って羅列することによって指定する。指定の際にはUNIXで利用可能なワイルドカードが利用できる。
購買データが保存してあるディレクトリには、これまでに利用してきたdat.xtを月別に分割し圧縮されたファイル「dat2002xx.gz(xxに月が入る)」が12個用意してある。これらのデータを全て羅列すると「xtcat -i dat200201.xt.gz,dat200202.xt.gz,...」と指定すことになる。
この方法は非常に面倒くさいので、ワイルドカードを使い「xtcat -i 'dat2002*.gz'」のように指定できる。これはdat2002で始まり、.gzで終るファイル名全てのファイルにマッチする。注意しなければならないのは、このワイルドカードはシェルに解釈させてはならない。あくまでもxtcatコマンド内部でワイルドカードにマッチするファイルを展開する。そのため、ワイルドカードを含んだファイル名はシングルクオーテーションで囲む必要がある。
そして最後に、出力ファイル名(xtcat.xt)、およびコメントの変更も忘れずに。
これらの変更を反映させたスクリプトを下図に示しておく。

#!/bin/bash
xtcat -i '/mnt/h00/tutorial/dat2002*.gz' |
xtcut -f 日付,数量,金額 |
xtagg -k 日付 -f 数量:数量合計,金額:金額合計 -c sum |
xtheader -l "チュートリアル" -c "xtcat" -o xtcat.xt

ここで求めた結果は、xtaggのチュートリアルで求めた結果と同じになっているはずである。各自で確認してもらいたい。

OnePoint ディレクトリインデックス
このxtcatコマンドをうまく使えば、ディレクトリによってインデックスの機能を実現できる。例えば全データを店別月別のディレクトリに格納しておけば店と月によるレコード選択を(A店の200201のデータならば「./A/200201」)、一つのファイルにまとめて選択するよりも格段に処理速度を高めることができる。これはMUSASHIの運用においてよく利用する手法である。
そしてデータの選択はxtcatコマンドで、ワイルドカードを用いて実現する。例えば店別月別のディレクトリがあったとすると、「./[ABCD]/20021?/dat.xt.gz」と指定すると、A、B、CもしくはD店の200210,200211,200212のデータのみを併合することが可能となる。

練習課題

次のようなデータを作成しよう。スクリプト名及び結果ファイル名は表に示されたものを使おう。

帳票名 スクリプト名 結果ファイル(xt) 結果ファイル(html)
4月から6月までのデータにおける日付別数量金額合計 xtcat1.sh xtcat1.xt xtcat1.html
1月、3月、5月のデータにおける日付別数量金額合計 xtcat2.sh xtcat2.xt xtcat2.html
4月から6月および10月から12月までのデータにおける日付別数量金額合計 xtcat3.sh xtcat3.xt xtcat3.html