Ansatzの備忘録

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

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

問題123 計算時間の解析

問題のファイルは

https://github.com/shellgei/shellgei160

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

それぞれのファイルについて、システムコール名と時間をセットで抜き出してawk連想配列で足し上げて計算すればいいと思ってやろうとしたがセットで抜き出すところで詰まってしまい結局できなかった。解答例では2つのファイルをまとめて処理しており、こんなやり方があるのかと感心した。

解答例は

grep ">$" dir[12]_strace | sed -E 's/dir(.)_strace:([^(]+).*<([.0-9]+)>.*$/\1 \2 \3/' | awk '{a[$2]+=($1==1)?-$3:$3}END{for(k in a){print k, a[k]*1000}}' | sort -k2,2n | tail -n 3

となる。最初のgrepでは2つのファイルをまとめてgrepしているので各出力行にファイル名が追加される。ここではまず時間が書いてある行だけを抜き出している。次にsedでファイル名の番号とシステムコール名、それからかかった時間だけを抜き出している。次のawkでは三項演算子を用いてかかった時間をファイル1のとき引いて2のとき足して処理している。最後にソートして末尾3つを抜き出して解答とした。