初級コマンド編 レコード間計算2(xtaccum)

と次章では、レコード間の計算を実現するコマンドを二つ紹介する。
xtaccumコマンドは、あるキー項目の値が同じ行について、ある数値項目の累計を計算する。

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

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

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

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

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

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

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

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

<?xml version="1.0" encoding="euc-jp"?>
<xmltbl version="1.00">
<header>
<title>
チュートリアル
</title>
<comment>
xtshare
</comment>
<field no="1">
<name>日付</name>
<sort priority="1">
</sort>
</field>
<field no="2">
<name>数量</name>
</field>
<field no="3">
<name>金額</name>
</field>
<field no="4">
<name>数量累計</name>
</field>
<field no="5">
<name>金額累計</name>
</field>
</header>
<body><![CDATA[
19960105 330 170023 330 170023
19960106 376 202936 706 372959
19960107 345 186710 1051 559669
19960108 365 192866 1416 752535
19960109 515 241954 1931 994489
19960110 487 213515 2418 1208004
19960111 464 220741 2882 1428745
19960112 642 315335 3524 1744080
19960113 632 286111 4156 2030191
19960114 325 170098 4481 2200289
19960115 404 207313 4885 2407602
19960116 626 322327 5511 2729929
19960117 536 268251 6047 2998180
19960118 502 248289 6549 3246469
19960119 542 235548 7091 3482017
19960120 576 250142 7667 3732159
19960121 456 212493 8123 3944652
19960122 375 175588 8498 4120240
19960123 590 268325 9088 4388565
19960124 524 215801 9612 4604366
19960125 743 330867 10355 4935233
19960126 643 276340 10998 5211573
19960127 699 312099 11697 5523672
19960128 419 231647 12116 5755319
19960129 503 232898 12619 5988217
19960130 562 260900 13181 6249117
19960131 595 351001 13776 6600118
]]></body>
</xmltbl>

xtaccumはxtshareと違い、入力データのレコードの並びによって結果が異なってくる。上記の例で言えば、日付を昇順から降順に換えた場合の累計値は同然違ったものとなる。
上記の例では、たまたま日付順にデータが並んでいたから、期待通りの結果になったのであり、本来ならば、xtaccumを実行する前に、xtsortを使い、累計を計算したい順にレコードを並べ替えておく必要がある。この点を考慮したスクリプトは以下のようになる。「xtsort -k 日付%r」の指定により、xtaccumが実行される前にデータが日付降順に並べ換わり、その順序で累計が計算される。結果は各自で確認してもらいたい。

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

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

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

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

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

また、xtshareと同様にキー項目を伴った累計計算も可能である。ただし、xtaccumの前に指定するxtsortが若干複雑になる。xtshareと同様に、各効能2(大分類)別に日別数量金額累計を求めて見よう。xtaccumを使うまではxtshareの例と同じである。そして効能2と日別項目で並べ替えておく必要がある。「xtsort -k 効能2,日付%r」を指定する。ここで効能2は、xtaccumが累計の単位とする項目である(効能2の値が変わるたびに累計が0クリアされる)。そして「日付%r」の指定が累計をどの順序で取るかについての指定で、ここでは日付の降順で累計を取ることになる。
これらの変更を加えたスクリプトを以下に示しておく。結果は各自で確認してもらいたい。

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

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

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

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

#---------------------------------------------------------------
# コマンド
#---------------------------------------------------------------
xtcut -f 効能2,日付,数量,金額 -i $inPath/dat.xt.gz |
xtagg -k 効能2,日付 -f 数量,金額 -c sum |
xtsort -k 効能2,日付%r |
xtaccum -k 効能2 -f 数量:数量累計,金額:金額累計 |
xtheader -l "$title" -c "$comment" -o xtaccum.xt
#===============================================================

OnePoint ソートを意識すべきコマンド
MUSASHIでは、処理速度を高めるために、データのヘッダーに<sort>タグを持っていることを以前に解説した。これは通常ならばユーザは意識しなくてもよい。しかしながら、ユーザが明確にデータの並び順を意識しなければならないコマンドもいくつかある。ここで解説したxtaccumコマンドもその一つである。その他にxtbest, xtslide, xtpatternも「ソートを意識しなければならないコマンド」である。これらのコマンドでは、事前にキー項目および処理対象となる項目でソートしておかなければならない。

練習課題

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