シェルワンライナー #7

問題

与えられたテキストに対する税率の計算。
2019/10以前なら8%。それ以降ならば、8%と10%。商品名に*がついているのは8%。

1 20190901 ゼロカップ大関 10000 
2 20190902 *キャベツ二郎 130
3 20191105 外食 13000
4 20191106 ストロングワン 13000
5 20191106 *ねるねるねるねる 30
6 20190912 外食 13000

回答

自分の回答

  • 考えた段取り

    • 2列目の先頭に *がついている 3列目 * 1.08
    • 2列目の先頭に *がついている 3列目 * 1.10
    • でまずは出力する
    • その後、なんか変数設けて足し算する
  • だめな回答

    • あれ?答えが違うじゃん?と思ったら、20191001より前ならば税率を8%としないといけないっぽい。
cat kakeibo.txt | awk 'BEGIN{sum=0}{if($2 ~ /^\*/){sum += int($3*1.08)} else {sum+=int($3*1.10)}} END{print sum}'
  • OKな回答
    • もう一個日付で切り替える条件のif文をあたまにつけた。
cat kakeibo.txt | awk 'BEGIN{sum=0} {if($1>20191001){if($2 ~ /^\*/){sum += int($3*1.08)} else {sum+=int($3*1.10)}} else{sum += int($3*1.08)}} END{print sum}'

({}がどこに対応するかかなり分かりづらい…)

テキストの回答

#わかりやすさのために、パイプ毎に改行してます
cat kakeibo.txt | 
awk '{if($1<20191001||$2 ~"^*"){print $0,1.08} else{print $0,1.1}}' | 
awk '{print int($3*$4)}' | 
numsum
  • 思ったこと
    • 日付の条件のところはORでつなげば良いじゃん。なるほど
    • 変数使って一回で計算せずとも、パイプで出力をつなぐ形にすれば変数すらいらない。なるほど
    • numsumコマンドっていうのがあるのか。なるほど
      • でもデフォルトでは入ってなかったので、 sudo apt install num-utils でインストールした
    • awkコマンドのフィルタで正規表現するときについて / / で囲う場合と ” ” で囲う場合がある
      • “ ” で囲う時は中が文字列リテラルとして認識されるので、 * をフィルタしたいときにエスケープが不要らしい。
    • ほんとの答えはif-elseじゃなくて三項演算子使ってた

補足

回答のところに書いたので特になし。

感想

  • 自分で一旦考えながらやると、答えをみたときに学びが深い。
    • if文とか一行で書くと、インデントつけれなくてかなり辛い。。。
    • テキストは三項演算子使ってたけど、if文だと括弧の対応が分かりづらいというのもあるからなのかな?
  • awkの構文なかなか、記憶できない。。。