基本コマンド編:レコード間計算1(xtshare)

本章と次章では、レコード間の計算を実現するコマンドを二つ紹介する。
xtshareコマンドは、あるキー項目の値が同じ行について、ある数値項目の合計に対する各行の数値項目値の割合(シェア)を計算する。


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

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

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

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

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

$ more xtshare.xt
<?xml version="1.0" encoding="euc-jp"?>
<xmltbl version="1.1">
<header>
<title>チュートリアル</title>
<comment>xtshare</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 0.003013 0.002888
20020102 40 13959 0.000748 0.000672
20020103 155 62402 0.0029 0.003002
20020104 107 41467 0.002002 0.001995
20020105 52 21283 0.000973 0.001024
20020106 106 43070 0.001983 0.002072
20020107 87 31458 0.001628 0.001513
20020108 98 40726 0.001834 0.001959
20020109 152 61779 0.002844 0.002972
20020110 144 51501 0.002694 0.002478
--More--(5%)

次に、中分類別に小分類のシェアを求めて見よう。利用する項目として、前述の「中分類」、「小分類」、「数量」、「金額」の項目が必要となる。
そして中分類別に求めるので、xtshareの"-k"に中分類を指定する。これらの変更を加えたスクリプト(xtshareclass.sh)を以下に示しておく。

#!/bin/bash
xtcut -f 中分類,小分類,数量,金額 -i /mnt/h00/tutorial/dat.xt |
xtagg -k 中分類,小分類 -f 数量,金額 -c sum |
xtshare -k 中分類 -f 数量:数量シェア,金額:金額シェア |
xtheader -l "チュートリアル" -c "xtshareclass" -o xtshareclass.xt

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

$ more xtshareclass.xt
<?xml version="1.0" encoding="euc-jp"?>
<xmltbl version="1.1">
<header>
<title>チュートリアル</title>
<comment>xtshareclass</comment>
<field no="1" name="中分類" sort="1"></field>
<field no="2" name="小分類" sort="2"></field>
<field no="3" name="数量"></field>
<field no="4" name="金額"></field>
<field no="5" name="数量シェア"></field>
<field no="6" name="金額シェア"></field>
</header>
<body><![CDATA[
11 1101 6247 2388930 0.182431 0.179297
11 1102 1515 546193 0.044243 0.040994
11 1103 365 145373 0.010659 0.010911
11 1104 2173 849791 0.063458 0.06378
11 1105 2249 860320 0.065678 0.06457
11 1106 1277 487220 0.037292 0.036568
11 1107 2087 913009 0.060947 0.068524
11 1108 1855 621047 0.054172 0.046612
11 1110 2091 844705 0.061064 0.063398
--More--(46%)

OnePoint 途中結果の確認
スクリプトで用いるコマンド数が今回の例のように増えてくると、各コマンドが出力する途中の結果を見たくなるケースもでてくる。例えば、最終結果のデータが思い通りのものになっていない場合には、それまでの途中経過を見ることは重要な作業である。その時に便利なコマンドとしてUNIXのオリジナルコマンド「tee」がある。出力結果を見たいコマンドの後にパイプで続けて「tee ファイル名」を挿入すると、その時点での途中経過が、指定したファイル名に保存される。もちろん「tee」の末尾にパイプを入れなければならない。このコマンドは、パイプから受け取ったデータを指定のファイルに書き出し、かつ次のパイプに送り込むという機能をもっている。本章で作成したスクリプトに「tee」を入れて、動作を確認してみよう。

練習課題

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

帳票名 スクリプト名 結果ファイル(xt) 結果ファイル(html)
メーカーの数量金額シェア xtshare1.sh xtshare1.xt xtshare1.html
中分類別メーカの数量金額シェア xtshare2.sh xtshare2.xt xtshare2.html