基本コマンド編:レコード集計(xtagg)

ここではレコードの集計方法について学習する。このコマンドの使用頻度は非常に高い。


先に作成したスクリプトxtcut.shを再利用することにする。
まずFDcloneでは、xtcut.shにカーソルを合わせ、"Ctrl"を押しながら"c"を押すと、新し名前で、ファイルをコピーできる。新しい名前は"xtagg.sh"としておこう。
UNIXコマンドでは"cp xtcut.sh xtagg.sh"でコピーできる。

新しくコピーされたファイル"xtagg.sh"を編集する。xtcutで日付、数量、金額を抜き出しているが、その次に、日別に数量と金額を合計する処理を行う。
集計にはxtaggマンドを利用する。xtaggでは"-k"でどの項目を単位に集計するかを指定し(そのような項目のことをキー項目と呼ぶことにする)、"-f"で実際に集計する項目を指定する。そして"-c"で集計の方法を指定する。
ここでは合計なので"-c sum"と指定する(そして最後に、出力ファイル名(xtagg.xt)、およびコメントの変更も忘れずに)。
xtaggを挿入したスクリプトを下図に示しておく。

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

ここで指定した三行の意味は次の通りである。
xtcutで「日付」、「数量」、「金額」の項目を選択し、その結果をパイプラインで次のxtaggコマンドに送る。xtaggコマンドでは、日付を単位に(キー項目として)、数量、金額を合計する。そしてその結果データは再びパイプラインによって次のxtheaderコマンドに送られる。xtheaderコマンドは、タイトルとコメントを変更し、その結果を"xtagg.xt"というファイルに書き込む。

スクリプトの編集が終れば保存して、実行する。結果データを確認すると下図のように、日別に数量と金額が合計されているはずである。

$ more xtagg.xt
<?xml version="1.0" encoding="euc-jp"?>
<xmltbl version="1.1">
<header>
<title>チュートリアル</title>
<comment>xtagg</comment>
<field no="1" name="日付" sort="1"></field>
<field no="2" name="数量"></field>
<field no="3" name="金額"></field>
</header>
<body><![CDATA[
20020101 161 60034
20020102 40 13959
20020103 155 62402
20020104 107 41467
20020105 52 21283
20020106 106 43070
20020107 87 31458
20020108 98 40726
20020109 152 61779
20020110 144 51501
20020111 150 62140
20020112 177 69727
--More--(6%)

さて、次に出力されたデータの項目名「数量」、「金額」を「合計数量」、「合計金額」に変更してみよう。
項目名の変更はxtheaderでも可能であるが、ここではxtaggコマンドで変更する方法を示しておく。
項目の変更は"-f"パラメータの中で行う。項目名に続けて":"(コロン)を入れ、続いて新しい項目名を指定する。
新しい項目名を反映させたスクリプトは下図のようになる。

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

実行結果が下図のように、ヘッダーの項目名が変更されていることを確認しておこう。

$ more xtagg.xt
<?xml version="1.0" encoding="euc-jp"?>
<xmltbl version="1.1">
<header>
<title>チュートリアル</title>
<comment>xtagg</comment>
<field no="1" name="日付" sort="1"></field>
<field no="2" name="数量合計"></field>
<field no="3" name="金額合計"></field>
</header>
<body><![CDATA[
20020101 161 60034
20020102 40 13959
20020103 155 62402
20020104 107 41467
20020105 52 21283
20020106 106 43070
20020107 87 31458
20020108 98 40726
20020109 152 61779
20020110 144 51501
20020111 150 62140
20020112 177 69727
--More--(6%)

xtaggコマンドでは、合計の他に、平均(-c avg)、最大値(-c max)、最小値(-c min)を求めることができる。これらの機能は各自、マニュアルを参照して練習課題で確認してもらいたい。

OnePoint <sort>タグについて
xtaggを実行した結果データのヘッダーの日付項目に"sort"属性ついているのがわかる(<field no="1" name="日付" sort="1">)。これは、xtaggコマンドから出力されるデータが日付項目で並べ替えられていることを意味する。
MUSASHIが提供するコマンドには、入力データが並べ換わっていると処理効率が高くなるものが多い。このsort属性はそのような処理効率の目的で用いられている。しかしユーザが特に意識しなければならないことはまずないであろう。

xtaggと同じ動きをするコマンドにxtstatisticsがある。このコマンドを使えば、合計や平均以外の分散や標準偏差などの基本統計量を求めることができる。利用方法はxtaggと全く同じなので、興味のある人は試してみよう。

練習課題

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

帳票名 スクリプト名 結果ファイル(xt) 結果ファイル(html)
日別数量金額平均 xtagg1.sh xtagg1.xt xtagg1.html
日別数量金額最大値 xtagg2.sh xtagg2.xt xtagg2.html
日別数量金額最小値 xtagg3.sh xtagg3.xt xtagg3.html
中分類別数量金額合計 xtagg4.sh xtagg4.xt xtagg4.html
中分類別数量金額平均 xtagg5.sh xtagg5.xt xtagg5.html
小分類別メーカー別数量金額合計 xtagg6.sh xtagg6.xt xtagg6.html
小分類別メーカー別数量金額平均 xtagg7.sh xtagg7.xt xtagg7.html