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

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

著者:岡田健

 ユニケージでは、小さな道具の「コマンド」をシェルスクリプトで組み合わせて、さまざまな業務システムを構築しています。本連載では、毎回あるテーマに従ってユニケージによるシェルスクリプトの記述例を分かりやすく紹介します。第7回は、書き方のルールとなるお作法と分かりやすいコードの書き方について解説します。

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

図1 売上計算するシェルスクリプト

cat SALES                       |
#  1:店舗 2:商品No 3:日付 4:売数
#  5:売上 6:割引
join1 key=2 PRICE               | # 原価 / 売価を連結
#  1:店舗 2:商品No 3:原価 4:売価
#  5:日付 6:売数   7:売上 8:割引
join1 key=2 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 -                      # 出力

図2 awkによる長いコードが挿入されたシェルスクリプト

cat ZAIKO             |
#  1:商品CD     2:規格CD     3:拠点CD   4:サイズCD
#  5:産地CD     6:ブランドCD 7:仕入先CD 8:発注先CD
#  9:在庫発生日 10:製造日    11:販売日  12:数量
(略)

図3 在庫を扱うシェルスクリプトの先頭部分

cat ZAIKO             |
#  1:商品CD     2:規格CD     3:拠点CD   4:サイズCD
#  5:産地CD     6:ブランドCD 7:仕入先CD 8:発注先CD
#  9:在庫発生日 10:製造日    11:販売日  12:数量
cjoin2 key=1 SHOHIN - |
#  1:商品CD   2:商品名      3:規格CD     4:拠点CD
#  5:サイズCD 6:産地CD      7:ブランドCD 8:仕入先CD
#  9:発注先CD 10:在庫発生日 11:製造日    12:販売日
#  13:数量
cjoin2 key=3 KIKAKU - |
#  1:商品CD   2:商品名    3:規格CD      4:規格名
#  5:拠点CD   6:サイズCD  7:産地CD      8:ブランドCD
#  9:仕入先CD 10:発注先CD 11:在庫発生日 12:製造日
#  13:販売日  14:数量
(略)

図4 各種マスターを使って在庫に名称を挿入するシェルスクリプトの一部

cat ZAIKO             |
#  1:商品CD     2:規格CD     3:拠点CD   4:サイズCD
#  5:産地CD     6:ブランドCD 7:仕入先CD 8:発注先CD
#  9:在庫発生日 10:製造日    11:販売日  12:数量
cjoin2 key=1 SHOHIN - |
#  1:商品CD   2:商品名      3:規格CD     4:拠点CD
#  5:サイズCD 6:産地CD      7:ブランドCD 8:仕入先CD
#  9:発注先CD 10:在庫発生日 11:製造日    12:販売日
#  13:数量
cjoin2 key=3 KIKAKU - |
#  1:商品CD   2:商品名    3:規格CD      4:規格名
#  5:拠点CD   6:サイズCD  7:産地CD      8:ブランドCD
#  9:仕入先CD 10:発注先CD 11:在庫発生日 12:製造日
#  13:販売日  14:数量
(略)

図5 図4の修正版

cat ZAIKO              |
#  1:商品CD     2:規格CD     3:拠点CD   4:サイズCD
#  5:産地CD     6:ブランドCD 7:仕入先CD 8:発注先CD
#  9:在庫発生日 10:製造日    11:販売日  12:数量
self 0 1               |
cjoin2 key=NF SHOHIN - |
delf NF-1              |
#  1:商品CD     2:規格CD     3:拠点CD   4:サイズCD
#  5:産地CD     6:ブランドCD 7:仕入先CD 8:発注先CD
#  9:在庫発生日 10:製造日    11:販売日  12:数量
#  13:商品名
self 0 3               |
cjoin2 key=NF KIKAKU - |
delf NF-1              |
#  1:商品CD     2:規格CD     3:拠点CD   4:サイズCD
#  5:産地CD     6:ブランドCD 7:仕入先CD 8:発注先CD
#  9:在庫発生日 10:製造日    11:販売日  12:数量
#  13:商品名    14:規格名
(略)