シェルスクリプトマガジン

ユニケージ新コードレビュー(Vol.63掲載)

著者:岡田 健

ユニケージでは、小さな道具の「コマンド」をシェルスクリプトで組み合わせて、さまざまな業務システムを構築しています。本連載では、毎回あるテーマに従ってユニケージによるシェルスクリプトの記述例を分かりやすく紹介します。第10回は、グラフ可視化ソフト「Graphviz」を用いたグラフィカルなコード設計書の作成方法について解説します。

シェルスクリプトマガジン Vol.63は以下のリンク先でご購入できます。

図1 粗利を計算するシェルスクリプト(Source1.sh)

######################################
#| input:      [原価マスタ]    PRICE
#| output:     [原価マスタ修正] $tmp-price
#| outline:    原価マスタから必要な部分だけ抜き出す
######################################
cat PRICE |
self 1/3  > $tmp-price

######################################
#| input:      [部門マスタ]    CATEGORY
#| output:     [部門マスタ修正] $tmp-category
#| outline:    部門マスタから必要な部分だけ抜き出す
######################################
cat CATEGORY |
self 1/3     > $tmp-category

######################################
#| input:      [原価マスタ修正] $tmp-price
#| input:      [部門マスタ修正] $tmp-category
#| output:     [出力]        $tmp-out
#| outline:    粗利計算をする
######################################
cat SALES                       |
#  1:店舗 2:商品No 3:日付 4:売数
#  5:売上 6:割引
join1 key=2 $tmp-price          | # 原価 / 売価を連結
#  1:店舗 2:商品No 3:原価 4:売価
#  5:日付 6:売数   7:売上 8:割引
join1 key=2 $tmp-category       | # 部門を連結
#  1:店舗 2:商品No 3:部門 4:原価
#  5:売価 6:日付   7:売数 8:売上
#  9:割引
lcalc '$3,$7,$8,$8-$7*$4'       | # 売数 / 売上 / 荒利計算
#  1:部門 2:売数 3:売上 4:粗利
msort key=1                     | # 部門でソート
sm2 1 1 2 4                     | # 売数 / 売上 / 荒利集計
sm5 1 1 2 4                     | # 合計行の付加
divsen 2 3 4                    | # 千で除算
divsen 3 4                      | # 千で再除算
lcalc '$1,$2,$3,$4,100*$4/$3'   | # 荒利率を求める
#  1:部門   2:売数 3:売上 4:粗利
#  5:粗利率
marume 5.1                      | # 四捨五入
join2 key=1 CATEGORY_NAME       | # カテゴリ名の連結
#  1:部門 2:部門名 3:売数 4:売上
#  5:粗利 6:粗利率
comma 3 4 5                     | # カンマ編集
keta                            | # 桁そろえ
keisen +e                       | # 罫線を引く
cat header -                      # 出力

図3 DOT言語で書かれた中間コード(Source1.dot)

digraph sample {
  graph[ layout=dot ];
  node[fontname="IPAゴシック"];
  ID:1 原価マスタから必要な部分だけ抜き出す [ shape=box ];
  ID:2 部門マスタから必要な部分だけ抜き出す [ shape=box ];
  ID:3 粗利計算をする [ shape=box ];
  [原価マスタ] [shape = ellipse, peripheries = 2]
  [部門マスタ] [shape = ellipse, peripheries = 2]
  [出力] [ shape = ellipse, style = bold];
  [原価マスタ修正] [ shape = ellipse, style = bold];
  [部門マスタ修正] [ shape = ellipse, style = bold];
  [原価マスタ] -> ID:1 原価マスタから必要な部分だけ抜き出す [color = blue, style = bold, arrowsize = 1]
  ID:1 原価マスタから必要な部分だけ抜き出す -> [原価マスタ修正] [color = red, style = bold, arrowsize = 1]
  [部門マスタ] -> ID:2 部門マスタから必要な部分だけ抜き出す [color = blue, style = bold, arrowsize = 1]
  ID:2 部門マスタから必要な部分だけ抜き出す -> [部門マスタ修正] [color = red, style = bold, arrowsize = 1]
  [原価マスタ修正] -> ID:3 粗利計算をする [color = blue, style = bold, arrowsize = 1]
  [部門マスタ修正] -> ID:3 粗利計算をする [color = blue, style = bold, arrowsize = 1]
  ID:3 粗利計算をする -> [出力] [color = red, style = bold, arrowsize = 1]
}