基本コマンド編:項目の選択(xtcut)

この章では、データ項目を切り出すコマンドxtcutについて学習する。

注)MUSASHIはデータを加工するための多様なコマンドを提供する。それらのコマンドは、UNIXの標準コマンドと同様に、シェルのコマンドプロンプトから直接実行することができる。しかしながら、ここでは、たとえ数回コマンドを実行するだけであっても、コマンドプロンプトから直接起動するのではなく、シェルスクリプトとして記述し、それを後で実行するという形式をとる。

 販売データには多くの項目が含まれている。ここでは、まず「日付」、「数量」、「金額」の三項目を切り出す(選択する)処理を考える。項目の選択にはxtcutコマンドを用いる。
"-i"に入力データファイル名を、"-o"に出力データファイル名を、そして"-f"で選択したい項目名を指定する。
スクリプト(ファイル名は"xtcut.sh"とする)は次のようになる。テキストエディタ(viなど)で、以下のような一行を書こう(一行目は決り文句として"#!/bin/bash"と入力しておこう)。

#!/bin/bash
xtcut -f 日付,数量,金額 -i /mnt/h00/tutorial/dat.xt -o xtcut.xt

"bash xtcut.sh"と入力して実行してみよう。処理が終れば完了メッセージが表示されるはずである(下図参照)。
もし、いくら待ってもそのようなメッセージが出てこなければ何か間違っている可能性がある。"Ctrl+c"で強制的に終了し、再度スクリプトを編集する。

$ bash xtcut.sh
#END# 18031 2003/07/31 18:23:37 "xtcut -f 日付,数量,金額 -i /mnt/h00/tutorial/da
t.xt -o xtcut.xt" in=38733 out=38733
$

終了メッセージが#ERROR#で始まる終了メッセージが出力された場合は、何らかの不具合があることを意味する。例えば下の例では「日付」と書くべきところを「日」と書いてしまったために、「そのような項目名はない」というエラーメッセージが表示されている。

$ bash xtcut.sh
#ERROR# 18032 "xtcut -f 日,数量,金額 -i /mnt/h00/tutorial/dat.xt -o xxham" "fiel
d name not found : [日]"
$

無事完了すれば、新しく"xtcut.xt"というファイルができているはずである。
内容を確認すれば、下図のように、日付、数量、金額の三つの項目が選択されているのが確認できるであろう。

$ more xtcut.xt
<?xml version="1.0" encoding="euc-jp"?>
<xmltbl version="1.1">
<header>
<title>顧客購買履歴データ</title>
<comment>
人工データ
</comment>
<field no="1" name="日付"></field>
<field no="2" name="数量"></field>
<field no="3" name="金額"></field>
</header>
<body><![CDATA[
20020101 1 271
20020101 1 459
20020101 1 341
20020101 1 420
20020101 1 420
20020101 1 396
20020101 1 609
20020101 4 1636
20020101 1 356
20020101 4 1248
--More--(0%)

次に、xtheaderについて学習しよう。
上図に示されたデータを見てもわかるように、タイトルとコメントは、入力データである"/mnt/h00/tutorial/dat.xt"のものがそのまま使われている。xtheaderを使うことによって、このタイトルとコメントを変更することができる。
そこで再度xtcut.shを編集する。
まず、xtcutの行の"-o xtcut.xt"を削除し、行末にパイプ(縦棒"|")を入れておく。そして、xtheaderコマンドを次の行に入力する。このことにより、xtcutで処理した結果をパイプラインを通して次の行のコマンド(xtheader)に送り込むことができる。
xtheaderはデータの<title>、<comment>、<field>タグを変更するためのコマンドである。
xtheaderでは"-l"にタイトル、"-c"にコメントを指定する。
そして最後に、処理結果をxtcut.xtに書き込むように"-o"パラメータを記述しておく。
これらの変更を反映させたスクリプトを下図に示しておく。

#!/bin/bash
xtcut -f 日付,数量,金額 -i /mnt/h00/tutorial/dat.xt |
xtheader -l "チュートリアル" -c "xtcut" -o xtcut.xt

このスクリプトを保存し、実行する。タイトルとコメントが変更されていることが確認できるであろう(下図参照)。

$ more xtcut.xt
<?xml version="1.0" encoding="euc-jp"?>
<xmltbl version="1.1">
<header>
<title>チュートリアル</title>
<comment>xtcut</comment>
<field no="1" name="日付"></field>
<field no="2" name="数量"></field>
<field no="3" name="金額"></field>
</header>
<body><![CDATA[
20020101 1 271
20020101 1 459
20020101 1 341
20020101 1 420
20020101 1 420
20020101 1 396
20020101 1 609
20020101 4 1636
20020101 1 356
20020101 4 1248
20020101 1 436
20020101 1 364
--More--(0%)

OnePoint タイトルとコメントの重要性
このようにタイトルとコメントを結果のデータに入力することによって、後でデータを閲覧したときに、何のデータかを確認することができる。xtheaderなしにデータを書き出すことも可能であるが、後で何のデータか分からなくなることを防ぐために、必ずタイトルとコメントは入れるようにしておこう。

OnePoint 実行時のメッセージ
 MUSASHIでは全てのコマンドにおいて、実行時に処理内容に関するメッセージを書き出す。スクリプトを実行すると画面上に"#"で始まるメッセージが表示されるのを見たであろう。どのコマンドがいつ終了したか、どのようなオプションが指定されたか、どのファイルから読み込んだか、どのファイルに書き込んだか、どのようなエラーが生じたか(最重要!!)といった情報が出力される。さらにFDcloneにてスクリプトを”X"で実行すると、メッセージを画面に出力するのと同時に、カレントディレクトリの「log」というファイルにも画面と同じ内容のメッセージを書き出す。FDでは"x"(小文字)でもスクリプトを実行できるが、"X"で実行する時との大きな違いは、この「log」ファイルを吐き出すかどうかである。
 もし結果データが思い通りのものでなければ「log」ファイルをチェックすれば何か解決の糸口になるかもしれない。

OnePoint -iと-o
 MUSASHIでは、各コマンドが処理するデータを、そのコマンドにどのように入出力するかについて、2つの方法がある。一つは、上記の説明にも書いたように、-iと-oを使う方法である。その他にも、標準入出力からもデータを入出力することができる。例えば、「xtcut -f 日付 -i input.xt -o output.xt」というコマンドは、「xtcut -f 日付 <input.xt >output.xt」としても、結果は全く同じである。
 ただし、-iと-oを使うと、logファイルにどのファイルを入力データ(出力データ)としたかが記録される。標準入出力を使うと、logファイルには記録されない。

OnePoint 接尾語
 ファイル名の接尾語(例えば ".xt"や".sh")は、必ずしもつけなければならないというルールはない。後から、ファイル名を見て、何のためのファイルであるかをユーザが識別しやすいくするために、慣例的に付けているものである。
 スクリプトに".sh"という接尾語をつけなくても、全く問題なく動作する。またXMLtableのデータについて".xt"を付けなくても、MUSASHIの各コマンドは全く問題なくXMLtableとして認識してくれる。

練習課題

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

帳票名 スクリプト名 結果ファイル(xt) 結果ファイル(html)
メーカー、ブランド、粗利金額を抜き出す xtcut1.sh xtcut1.xt (ファイルサイズが大きいので省略)) ファイルサイズが大きいので省略
顧客、レシートを抜き出す xtcut2.sh xtcut2.xt (ファイルサイズが大きいので省略)

元のデータから、様々な項目を抜き出してみよう。