初級コマンド編 項目の結合(xtjoin)

初級コマンド編最後は、xtjoinによる項目の結合について解説する。

ここでは、効能2別の数量金額合計に、効能2のコードに対応する名前項目を別のファイルから結合する。
先に作成したスクリプトxtcut.shを再利用することにする。xtcut.shをxtjoin.shの名前でコピーしておこう。
新しくコピーされたファイル"xtjoin.sh"を編集する。
まずは効能2別数量金額合計のデータを作成する。xtcut 、xtaggコマンドを利用すればよい。
次に効能2コードに対する名前のファイルが、入力ファイルと同じディレクトリに「ko2.xt」という名前で入っている。その中身は下図に示されるように、効能2のコードと効能2の名前の対応表になっている。

<?xml version="1.0" encoding="euc-jp"?>
<xmltbl version="1.00">
<header>
<field no="1">
<name>効能2</name>
<sort priority="1">
</sort>
</field>
<field no="2">
<name>効能2名</name>
<sort priority="2">
</sort>
</field>
</header>
<body><![CDATA[
11 医薬品
13 医療用医薬品
22 医療用品
23 健康食品
24 日用雑貨
25 化粧品
26 ベビー用品
31 食品
36 たばこ
41 DIY用品
42 ペット用品
43 文具、事務用品、情報文具
44 玩具
45 出版物
46 楽器、音響ソフト
51 家電
52 家具
53 車両用品
54 時計、メガネ
55 光学、写真関連品
61 衣料、衣服
62 寝具、寝装品
63 身の回り品
64 履物
65 スポーツ用具
79 企画、サービス
80 経費用品
99 販売コード
]]></body>
</xmltbl>

xtjoinコマンドでは「-k」オプションでは結合されるデータの、また「-K」オプションでは結合するデータの、どの項目を結合の際のつきあわせ項目とするかを指定する。本節の例では、「-k 効能2」、「-K 効能2」という指定になる。今回のケースではたまたま両者とも同一名であるが、そのような時は「-K」パラメータを省略してもよい。そして実際に結合する項目(ここでは「効能2名」)を「-f」パラメータで指定する。そして結合するファイル名は「-m」パラメータで指定する。
そして最後に、出力ファイル名(xtjoin.xt)、およびコメントの変更も忘れずに。
これらの変更を反映させたスクリプトを下図に示しておく。

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

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

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

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

#---------------------------------------------------------------
# コマンド
#---------------------------------------------------------------
xtcut -f 効能2,数量,金額 -i $inPath/dat.xt.gz |
xtagg -k 効能2 -f 数量,金額 -c sum |
xtjoin -k 効能2 -m $inPath/ko2.xt -f 効能2名 |
xtheader -l "$title" -c "$comment" -o xtjoin.xt
#===============================================================

結果は下図のように、効能2別数量金額合計のデータに、効能2名が結合されているのが確認できるであろう。

<?xml version="1.0" encoding="euc-jp"?>
<xmltbl version="1.00">
<header>
<title>
チュートリアル
</title>
<comment>
xtjoin
</comment>
<field no="1">
<name>効能2</name>
<sort priority="1">
</sort>
</field>
<field no="2">
<name>数量</name>
</field>
<field no="3">
<name>金額</name>
</field>
<field no="4">
<name>効能2名</name>
</field>
</header>
<body><![CDATA[
11 1946 1825093 医薬品
13 4 1680 医療用医薬品
22 755 416326 医療用品
23 25 64511 健康食品
24 9599 3259061 日用雑貨
25 350 194481 化粧品
26 730 674090 ベビー用品
31 239 59285 食品
41 1 580 DIY用品
51 2 314 家電
55 5 5550 光学、写真関連品
61 1 1280 衣料、衣服
79 64 0 企画、サービス
]]></body>
</xmltbl>

OnePoint 圧縮ファイルの扱い
MUSASHIでは圧縮ファイルを直接扱うことができる。ただしファイル名を指定した場合は、ファイル名が「.gz」のファイルをgz圧縮のファイルとして扱うというルールがある。「-i」で指定したファイルの末尾が「.gz」であれば入力ファイルを圧縮ファイルと見なして読み込み、また「-o」で指定したファイルの末尾が「.gz」であれば結果を圧縮して書き出す。さらにxtjoinのように入出力以外のファイル(参照ファイル)についても同様のルールが適用される。すなわち、本章の例で言えば、「ko2.xt」が圧縮されて「ko2.xt.gz」という名前であったとすると、圧縮ファイルとして読み込んでくれる。
 またMUSASHIでは入力ファイルの指定を「-i」パラメータでなく、標準入力から読み込むことも可能である。その時、標準入力から読み込まれるデータが圧縮データであるかどうかは、各コマンドが自動判断している。また同様に出力ファイルの指定も「-o」パラメータでなく、標準出力に書き込むことも可能である。ただし、その時、圧縮して書き込みたければ「-z」パラメータを指定しなければならない。

練習課題

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