Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー160本ノック問題50

問題50 売り上げの集計

問題のファイルは

https://github.com/shellgei/shellgei160

からダウンロードできる。

二つの表を突き合わせて売り上げを正しく集計する問題だった。自力で解けたと思って答えを見たら間違えており、とても悔しい。枝番の処理をきちんとできていなかった。

自分の間違った解答は

sort -k3,4n sales | awk '{print $3,$4,$5}' | join -a 1 stones_master - | awk '{a[$3]+=($4)*($6)}END{for(i in a)print i,a[i] }'

である。これだと2つ目の awk連想配列を用いたときに枝番の情報が抜け落ちて余計なものがカウントされるようになってしまう。

正しい解答は

awk '{a[$3$4]+=$5}END{for(k in a)print k,a[k]}' sales | sort | join <(sed 's/ //' stones_master ) - | awk '{print $2,$3*$4}'

となる。sales に関しては枝番を商品番号に文字列としてくっつけてしまっている。stones_master ファイルは最初の空白のみを除去すればいいので sed でやっつけてしまっている。