基本コマンド編:部分文字列の切り出し(xtsubstr)

ここでは、ある項目の部分文字列を切り出すコマンドxtsubstrについて解説する。


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

データの集計においては、日別の数量金額合計を求めた。ここで日別を年月別に変更することを考える。もとの購買履歴データには「年月」という項目はない。しかし、「年月」の情報は「日付」項目の部分文字列(頭から6文字)として存在する。そこで「日付」項目から「年月」を切り出す必要がある。
 ある項目について部分文字列を切り出すためにはxtsubstrマンドを利用する。MUSASHIで日付は"YYYYMMDD"の書式で表されているので、年と月だけが必要となる場合は、日付文字列の1文字目から6文字目までを抜き出せばよい。
xtsubstrでは"-f"でどの項目を対象とするかを指定し、"-R"で抜き出す文字列の範囲を指定する。"-R"パラメータは、「開始位置_終了位置」の形式で指定する。年月を抜き出すためには、日付の1文字目から6文字目までを抜き出すので「-R 1_6」と指定すればよい。
 またxtsubstrコマンドは、既存の項目データを切り出されたデータで置き換えてしまう。例えば「xtsubstr -f 日付 -R 1_6」とすると、日付項目の内容が切り出された年月のデータに置き換わる。一方で新たな項目として出力したければ「-A」パラメータを付け加えればよい。新しく切り出された項目名を変更したければ、-fパラメータにて「-f 日付:年月」のように指定すればよい。
 以上の変更を加えたスクリプトを下図に示しておく(最後に、出力ファイル名(xtagg.xt)、およびコメントの変更も忘れずに)。

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

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

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

$ more xtsubstr.xt
<?xml version="1.0" encoding="euc-jp"?>
<xmltbl version="1.1">
<header>
<title>チュートリアル</title>
<comment>xtsubstr</comment>
<field no="1" name="年月" sort="1"></field>
<field no="2" name="数量合計"></field>
<field no="3" name="金額合計"></field>
</header>
<body><![CDATA[
200201 3819 1488557
200202 3939 1560494
200203 4330 1688577
200204 4677 1835522
200205 4931 1910983
200206 4806 1870580
200207 5030 1970791
200208 4668 1794748
200209 4614 1796331
200210 4602 1785801
200211 4062 1561058
200212 3965 1523414
--More--(96%)

練習課題

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

帳票名 スクリプト名 結果ファイル(xt) 結果ファイル(html)
月別数量金額合計 xtsubstr1.sh xtsubstr1.xt xtsubstr1.html
日別数量金額合計 xtsubstr2.sh xtsubstr2.xt xtsubstr2.html
時間(hour)別数量金額合計 xtsubstr3.sh xtsubstr3.xt xtsubstr3.html