初級コマンド編 レコード集計2(xtcount)

xtaggコマンド以外に重要な集計コマンドとしてxtcountがある。これはキー項目の値が同じ行が何行あるかをカウントするコマンドである。

ここでは、先に作成したスクリプトxtcut.shを再利用することにする。FDで、前章でおこなった手順で、xtcut.shをxtcount.shの名前でコピーしておこう。
新しくコピーされたファイル"xtcount.sh"を編集する。xtcutで日付、数量、金額を抜き出しているが、ここでは、日付のみを抜き出すように変更する。
次に各日付の値が同じ行がぞれぞれ何行あるかを計算するためにxtcountコマンドを用いる。xtcountでは"-k"でどの項目を単位に集計するかを指定する。またxtcountは、計算した行数を新しい項目として付け加える。その時、新しい項目名を"-a"パラメータで指定しなければならない。
そして最後に、出力ファイル名(xtcount.xt)、およびコメントの変更も忘れずに。
これらの変更を反映させたスクリプトを下図に示しておく。

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

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

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

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

#---------------------------------------------------------------
# コマンド
#---------------------------------------------------------------
xtcut -f 日付 -i $inPath/dat.xt.gz |
xtcount -k 日付 -a 行数 |
xtheader -l "$title" -c "$comment" -o xtcount.xt
#===============================================================

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

スクリプトの編集が終れば保存して、実行する。結果データを確認すると下図のように、日別にその行数が計算されている。
ここで新たに計算された「行数」という項目の意味は、各日に、レジで何回商品がスキャンされたかに等しい。

<?xml version="1.0" encoding="euc-jp"?>
<xmltbl version="1.00">
<header>
<title>
チュートリアル
</title>
<comment>
xtcount
</comment>
<field no="1">
<name>日付</name>
<sort priority="1">
</sort>
</field>
<field no="2">
<name>行数</name>
</field>
</header>
<body><![CDATA[
19960105 309
19960106 340
19960107 325
19960108 326
19960109 428
19960110 439
19960111 405
19960112 574
19960113 563
19960114 275
19960115 387
19960116 547
19960117 496
19960118 464
19960119 494
19960120 494
19960121 409
19960122 337
19960123 500
19960124 457
19960125 696
19960126 615
19960127 634
19960128 392
19960129 477
19960130 463
19960131 541
]]></body>
</xmltbl>

さて、次に入力データ全ての行数が何行あるかをカウントしてみよう。その際にはキーとなる項目ないので(言い方をかえれば、全行てが同じキー項目値をもつ)、-kパラメータを省略すればよい。
スクリプトは下図のようになる。

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

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

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

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

#---------------------------------------------------------------
# コマンド
#---------------------------------------------------------------
xtcut -f 日付 -i $inPath/dat.xt.gz |
xtcount -a 行数 |
xtheader -l "$title" -c "$comment" -o xtcount.xt
#===============================================================

実行結果は、下図のようになる。データは一行のみで、入力データの全行数が計算されている。これは、1996年1月に1287回の商品スキャンがあったということを意味する。

<?xml version="1.0" encoding="euc-jp"?>
<xmltbl version="1.00">
<header>
<title>
チュートリアル
</title>
<comment>
xtcount
</comment>
<field no="1">
<name>日付</name>
</field>
<field no="2">
<name>行数</name>
</field>
</header>
<body><![CDATA[
19960131 12387
]]></body>
</xmltbl>

OnePoint コマンドで指定しなかった項目はどうなるのか?
項目が「日付」のみの入力データに対して"xtcount -a 行数"を実行したとき、結果として、「日付」、「行数」の二項目が出力される。ここで、「日付」項目の値はどの日付になっているのであろうか?この質問は、前章で学習したxtaggについても同様に言える。「日付」、「数量」、「金額」を持つデータに対して"xtagg -k 日付 -f 数量 -c sum"を実行した場合、「金額」項目の値はどの金額の値になっているのであろうか?
多くの場合においては、キー順で並べた場合の最後の値が出力される。上述のxtcountの例であると、「日付」項目で並べたときの最後の値、すなわち"19960131"が出力されている。しかし、例外もあるので、コマンドで指定しない項目についての値についてのルールは無いと考えておいたほうがよいであろう。

OnePoint -kの特殊な指定
-kで指定するキー項目名について特殊な指定がある。本章で学習した通り、-kパラメータが省略された場合、xtcountは全ての行が同じキー項目値を持つものとして動作する。しかし一方で、-kを省略すると全行異なるキー項目値をもつものとして動作するコマンドもある(例えば、xtcal)。
-kを指定できる全てのコマンドにおいて、キー項目値を全行同じとみなすか、全行異なるものと見なすかを明示的に指定することができる。全行同じに見なしたければ"-k #same#" と指定し、異なるものと見なしたければ"-k #diff#" と指定する。但し、多くのコマンドでは、このような明示的な指定は意味をなさない。例えば、"xtcount -k #diff#"と指定しても、計算される行数は全て"1"となる。
また注意点として、#same#、#diff#という項目名は、MUSASHIが上記の目的のために予約している項目名であり、ユーザは実際のデータの項目名としては利用することができない。

練習課題

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