Lesson 10 四則演算

 この章では項目間の計算関係について学習していく。

 1. 項目演算(madd,msub,mmul,mdiv

 最初に項目演算について。上記のコマンドは左から足し算、引き算、掛け算、割り算をするコマンドである。まず、maddについて。maddはfieldで指定した項目の数値を合計しその値を新しい項目として追加する。さて、Lesson7で作ったdat7-1のデータを使ってmaddを使うことにする。
 
madd field=2,3,4 <dat7-1 > xxa
 結果を確認すれば第5項目に商品コード、数量、金額が足された項目になっているのが確認できるだろう。次にmsub,mmul,mdivについて。なぜ、maddとは別にす理由としてmaddとmsub,mmul,mdivとではパラメータの与え方が違うためである。maddは上記のとうりfieldに2個以上の項目をつけるのだが、msub,mmul,mdivはmmulで例えるとfield1に掛けられる項目を、field2に掛ける項目を置く事になる。さて、ここでLesson8に記してあるとうり金額÷数量で平均単価を求めてみる。使うデータはLesson9で作ったxxeを使用する。また、年代の範囲を10代〜90代にする。
 

mselnum field=1 range=10_90 <xxe    |\
mdiv field1=3 field2=2                       >dat10-1
 結果を確認すれば金額÷数量の値が第4項目に出ているのが確認できるだろう。また、項目演算の4つの中で一番使用頻度の高い物は、mdivである。その理由はこれからmコマンドを使って帳票を作っていくと解るであろう。

2. null値("*")について(mnulto

 上の項目演算を使用するにあたって、“*”が含まれていたら計算結果はどうなるのだろうか。それは・・・maadは“*”が含まれていると結果“*”は計算対象から省かれる。例えば500+10+“*”の答えは510になる。msub,mmul,mdivの場合、field1,field2のどちらかに“*”があった場合(field1,field2の両方とも“*”の場合でも)計算結果は“*”になる。もしnull値(“*”)を0として扱いたければ上記に記してあるmnultoを使用する。mnultoはfieldで指定された項目について、null値(“*”)をvalueで指定した値に変換する。null値(“*”)を0として扱う場合value=0にすれば(“*”)は0に変換される。また、null値(“*”)の種類を明示したいときにも用いられる。ちなみに、msub,mmul,mdivでfield1=0、field2=“*”(もしくはfield1=“*”、field2=0)の時の計算結果は“*”になる。

 3. 変換作業(m45,mdown,mup)

 上記の3つコマンドは、小数点以下に作用するコマンドである。簡単に説明するとm45は小数点第?を四捨五入、mdownは小数点第?を切り捨て、mupは小数点第?を切り上げするコマンドである。詳しくは、mコマンドマニュアルで確認してほしい。まず、m45をこの章で作ったdat1-10-1の結果で使ってみる。
 

m45 field=4 position=2  <dat10-1     |\
mcomma field=2,3                              >xxf
 結果を確認すれば小数点第2が四捨五入されていることが確認できるだろう。positionの値を変えることで四捨五入する点を変えることができる。(mdown、mupも同様に)また、新しいコマンドmcommaとは項目を数値とみなし、3桁ごとにコンマ( , )をつけるコマンドである。(数字以外の項目には何も処理しない。)
 

 4. 見やすい帳表に整形する

 さて、ここで '1998年の年代別平均購買単価'を1つのバッチで作り見やすい帳票に作っていく。 Lesson8〜Lesson10で作ったものを1つのバッチにしたものは以下のとうりである。
 
echo '1998年の年代別平均購買単価' >xxtitle
echo 'Lesson8にて作成'                 >>xxtitle
date                                     >>xxtitle
echo ': 年代: 数量: 金額: 平均購買単価:'               >xxfield

#入力ファイルの項目
#1:店コード,2:日付,3:時間,6:レシート番号,8:顧客コード,27:商品コード,14:数量,13:金額
gunzip -c /home/practice/Mine/Data/StoreMaster1/Dat/dat.gz |\
mselnum field=2 range=19980101_19981231                              |\
mdelnul field=8                                                                  |\
mcut field=8,14,13,2                                                               |\
sort                                                                           |\
mjoin key=1 master=/home/practice/Mine/Data/Birthday/Dat/dat field=2 >dat8-1

#入力ファイルの項目
#1:顧客コード,2:数量,3:金額,4:日付,5:生年月日
mage10 field1=4 field2=5 <dat8-1                   |\
mcut field=6,2,3                                            |\
sort                                                             |\
msum key=1 field=2,3                                     >dat9-1

mselnum field=1 range=10_90  <dat1-9-1 |\
mdiv field1=3 field2=2                             >dat10-1

m45 field=4 position=2 <dat10-1     |\
mcomma field=2,3                         |\
mlist2 title=xxtitle field=xxfield        >dat10-2