基本コマンド編:レコード間計算2(xtaccum)

xtaccumコマンドは、あるキー項目の値が同じ行について、ある数値項目の累計を計算する。


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

新しくコピーされたファイル"xtaccum.sh"を編集する。
ここではまず、日別数量金額合計のデータについて、数量合計と金額合計の累計を計算する。
まずxtcutで日付、数量、金額を抜き出したあと、日別の数量金額合計をxtaggコマンドで求める。そのデータに対してxtaccumコマンドを適用し、各日付の数量合計、金額合計の累計を求める。xtaccumでは"-k"でどの項目を単位に(単位ごとに累計値は0クリアされる)累計を計算するかを指定し、"-f"にどの数値項目の累計を求めるかを指定する。ここでは全体に対する日々の累計であるので、"-k"の指定は必要なく「xtaccum -f 数量,金額」でよい。ただし、xtaccumコマンドは指定した数値項目についての累積を計算し、その値を新しい項目として指定するため、その新項目名を"-f"で指定した項目名の後に指定する必要がある。そこで「xtaccum -f 数量:数量累計,金額:金額累計」と指定すればよい。
最後に、出力ファイル名(xtaccum.xt)、およびコメントの変更も忘れずに。
これらの変更を反映させたスクリプトを下図に示しておく。

xtaccumには"-s"パラメータの指定が必要である。xtshareと違い、入力データのレコードの並びによって結果が異なってくる。上記の例で言えば、日付の並びを昇順から降順に変えた場合の累計値は当然異なったものとなる。そこで、"-s"によって累積する順序を決める項目を指定する。"-s"では、xtsortコマンドのように、数値順や逆順の指定も可能である。

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

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

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

$ more xtaccum.xt
<?xml version="1.0" encoding="euc-jp"?>
<xmltbl version="1.1">
<header>
<title>チュートリアル</title>
<comment>xtaccum</comment>
<field no="1" name="日付" sort="1"></field>
<field no="2" name="数量合計"></field>
<field no="3" name="金額合計"></field>
<field no="4" name="数量累計"></field>
<field no="5" name="金額累計"></field>
</header>
<body><![CDATA[
20020101 161 60034 161 60034
20020102 40 13959 201 73993
20020103 155 62402 356 136395
20020104 107 41467 463 177862
20020105 52 21283 515 199145
20020106 106 43070 621 242215
20020107 87 31458 708 273673
20020108 98 40726 806 314399
20020109 152 61779 958 376178
20020110 144 51501 1102 427679
--More--(5%)

また、xtshareと同様にキー項目を伴った累計計算も可能である。xtshareと同様に、中分類別に小分類の数量金額累計を求めてみよう。xtaccumを使うまではxtshareの例と同じである。xtaccumコマンドを用いる前に中分類と小分類で並べ替えておく必要がある。「xtsort -k 中分類,小分類%r」を指定する。ここで中分類は、xtaccumが累計の単位とする項目である(中分類の値が変わるたびに累計が0クリアされる)。そして「小分類%r」の指定が累計をどの順序で取るかについての指定で、ここでは小分類の降順で累計を取ることになる。
これらの変更を加えたスクリプト(xtaccumclass.sh)を以下に示しておく。

#!/bin/bash
xtcut -f 中分類,小分類,数量,金額 -i /mnt/h00/tutorial/dat.xt |
xtagg -k 中分類,小分類 -f 数量,金額 -c sum |
xtaccum -k 中分類 -s 数量%n -f 数量:数量累計,金額:金額累計 |
xtheader -l "チュートリアル" -c "xtaccumclass" -o xtaccumclass.xt

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

$ more xtaccumclass.xt
<?xml version="1.0" encoding="euc-jp"?>
<xmltbl version="1.1">
<header>
<title>チュートリアル</title>
<comment>xtaccumclass</comment>
<field no="1" name="中分類" sort="1"></field>
<field no="2" name="小分類"></field>
<field no="3" name="数量" sort="2" numeric="1"></field>
<field no="4" name="金額"></field>
<field no="5" name="数量累計"></field>
<field no="6" name="金額累計"></field>
</header>
<body><![CDATA[
11 1103 365 145373 365 145373
11 1114 372 154587 737 299960
11 1120 523 248100 1260 548060
11 1197 746 324173 2006 872233
11 1113 943 393982 2949 1266215
11 1119 989 336226 3938 1602441
11 1115 1092 414138 5030 2016579
11 1106 1277 487220 6307 2503799
11 1117 1279 471076 7586 2974875
--More--(47%)

OnePoint 行の順序を意識すべきコマンド
今回のxtaccumで解説した"-s"のパラメータを使う必要のあるコマンド、すなわち行の並びを意識する必要のあるコマンドは、その他にもxtbest, xtslide, xtpatternなどいくつかある。

練習課題

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

帳票名 スクリプト名 結果ファイル(xt) 結果ファイル(html)
メーカーの数量金額累計(金額昇順)) xtaccum1.sh xtaccum1.xt xtaccum1.html
中分類別メーカの数量金額累計(金額降順) xtaccum2.sh xtaccum2.xt xtaccum2.html