初級コマンド編 レコードの併合(xtcat)

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

ここでは、先に作成したスクリプトxtagg.shを再利用することにする。xtagg.shをxtcat.shの名前でコピーしておこう。
新しくコピーされたファイル"xtcat.sh"を編集する。入力ファイルを併合するので、スクリプトの先頭にxtcatコマンドを挿入する。
xtcatコマンドでは、併合したい複数ファイルを"-i"オプションでカンマで区切って羅列することによって指定する。指定の再にはUNIXで利用可能なワイルドカードが利用できる。
入力データが保存してあるディレクトリには、1月の販売履歴データが「dat.xt.gz」、そして2月の販売履歴データが「dat2.xt.gz」の名前で保管されている(datで始まるファイルはこの2つのみ)。二つのデータを羅列するならば「xtcat -i dat.xt.gz,dat2.xt.gz」と指定する。またワイルドカードを使えば「xtcat -i 'dat*.gz'」のように指定できる。これはdatで始まり、.gzで終るファイル名全てのファイルにマッチする。注意しなければならないのは、このワイルドカードはシェルに解釈させてはならない。あくまでもxtcatコマンド内部でワイルドカードにマッチするファイルを展開する。そのため、ワイルドカードを含んだファイル名はシングルクオーテーションで囲む必要がある。
そして最後に、出力ファイル名(xtcat.xt)、およびコメントの変更も忘れずに。
これらの変更を反映させたスクリプトを下図に示しておく。

#/bin/bash
#===============================================================
# MUSASHI bash script
#===============================================================

#---- タイトル
title="チュートリアル"

#---- コメント
comment="xtagg"

#---- 各種変数(適宜修正すること)
inPath="/mnt/h00/prm/tutorial"

#---------------------------------------------------------------
# コマンド
#---------------------------------------------------------------
xtcat -i $inPath/'dat*.gz' |
xtcut -f 日付,数量,金額 |
xtagg -k 日付 -f 数量:合計数量,金額:合計金額 -c sum |
xtheader -l "$title" -c "$comment" -o xtagg.xt
#===============================================================

結果は、xtaggで求めた結果に加えて2月分の集計も計算されているはずである。各自で確認してもらいたい。

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

練習課題

次のようなデータを作成しよう。