last update: 2004年10月25日

処理概要

一つのコマンドは一つの処理

パイプによるコマンドの組み合わせ

シェルスクリプト

顧客別平均来店間隔日数

Legoブロック


一つのコマンドは一つの処理

MUSASHIは、単一の機能を持った小さなコマンド群を提供する。
各コマンドは、標準入力から入力データを読み込み、標準出力に結果データを書き込む。
例えば下図に示しているxtcutというコマンドは「項目を選択する」機能に特化したコマンドである。
コマンドに与えるパラメータの指定方法は、通常のUNIXのコマンドと同様であり、下図では「-f」に続けて選択したい項目名を指定している。

顧客コード 数量 金額
A0001 34 5630
A0002 6 1300
A0003 12 2540



xtcut -f 顧客コード,金額



顧客コード 金額
A0001 5630
A0002 1300
A0003 2540

パイプによるコマンドの組み合わせ

単一の機能をもったコマンドを「パイプ」で組み合わせることによって多様な処理が可能となる。「パイプ」の機能を利用することにより、あるコマンドの出力を次のコマンドの入力に連結することが可能となる。以下の例では、「顧客コード」と「金額」の項目をxtcutで選択した後に、その結果をxtselコマンドに渡している。xtselコマンドでは「金額」が2000以上の行を選択している。

顧客コード 数量 金額
A0001 34 5630
A0002 6 1300
A0003 12 2540


xtcut -f 顧客コード,金額




xtsel -c '金額>2000'



顧客コード 金額
A0001 5630
A0002 1300
A0003 2540

シェルスクリプト

以上のような処理を実際にコンピュータで行うためには、 1)コマンドラインから入力する、もしくは2)シェルスクリプトを記述する。

入力ファイルを「in.xt」、出力ファイル名を「out.xt」とすると、コマンドラインからの指定は以下のようになる。

% xtcut -f 顧客コード,金額 -i in.xt | xtsel -c '金額>2000' -o out.xt

組み合わせるコマンドの数が少なければコマンドラインから実行すればよいが、より多くのコマンドを組み合わせる場合は後で修正することも考慮に入れ、viやemacsなどのテキストエディタを利用しシェルスクリプトとして記述すればよいであろう。

#!/bin/bash
xtcut -f 顧客コード,金額 -i in.xt |
xtsel -c '金額>2000' -o out.xt

ここでは、見易さのために、コマンドが縦に並ぶようにパイプの後で改行している。またUNIXにおいてはスクリプトの一行目は特殊な意味を持っており、[#!]に続けて、このスクリプトを実行するプログラム(ここでは/bin/bash)を指定する。

顧客別平均来店間隔日数

最後に少し複雑な例として、顧客の平均来店間隔日数の求め方を示しておく。

購買履歴データ

xtcut -f 顧客,日付
顧客 日付
A
A
A
A
A
A
A
A
B
B
B
B
B
20040101
20040101
20040101
20040105
20040105
20040107
20040110
20040110
20040102
20040102
20040105
20040110
20040110


xtuniq -k 顧客,日付

顧客 日付
A
A
A
A
B
B
B
20040101
20040105
20040107
20040110
20040102
20040105
20040110


xtslide -k 顧客 -f 日付:次日付

顧客 日付 次日付
A
A
A
B
B
20040101
20040105
20040107
20040102
20040105
20040105
20040107
20040110
20040105
20040110
購買履歴データから「顧客」と「日付」項目を選択する。
通常、購買履歴データは、一つの商品の購買ごとにデータが記録される。
例えばAさんは1/1に3品目購買している。
どの日に来店したかがわかればよいので、同じ顧客で日付の重複行は省く。
来店間隔日数は、レコード間の「日付」項目により計算される。そこで、xtslideコマンドにより、日付項目の値を「一行上にずらし」、「次日付」という項目として追加する。


xtcal -c 'day(次日付,日付)' -a 日数

顧客 日付 次日付 日数
A
A
A
B
B
20040101
20040105
20040107
20040102
20040105
20040105
20040107
20040110
20040105
20040110
4
2
3
3
5

xtcut -f 顧客,日数

顧客 日数
A
A
A
B
B
4
2
3
3
5

xtagg -k 顧客コード -f 日数:平均来店間隔日数 -c avg

顧客コード 日数
A
B
3
4
「次日付」−「日付」の日数計算を行い、「日数」という項目を追加する。 「日付」と「次日付」は必要ないので省いておく。 顧客別に日数の平均値を計算し、項目名を「平均来店間隔日数」としておく。

Legoブロック

このように単一の機能をもつシンプルなコマンドを複数組み合わせることによって多様な処理を可能とする。この考え方はLegoブロックに例えることができる。それぞれ異なる形のブロッックを様々に積み上げることによって多様なオブジェを作り上げることができる。異なる点は、Legoでは組み合わせるうちにアイデアが刺激され、出来上がり像がどんどんかわってくる。一方で、MUSASHIのコマンドでは、たいていの場合は出来上がり像を既に決められている。そしてブロックの個々の形も知っている。しかしそれらをどのように組み立てればよいかが難しいところであり、またパズルのような、ちょっと知的な刺激でもある。

簡単な処理では2〜5つほどのコマンドの組み合わせで十分に事足りる。より複雑な処理になってくると、10以上のコマンドを組み合わせる必要がある。しかしながら、それらを全てパイプでつなげるのではなく、適当なところで切ってファイルに書き出しておくのがちょっとしたコツである。

チュートリアルにおいては、簡単な処理から少し複雑な処理まで様々なテーマを取り扱っている。本システムがいかに柔軟でかつ効率的に大量データを処理できるかをわかってもらえるであろう。