今回は棒グラフを書く方法について書きます。
カウントをとった後に数値を見やすくする時、使用すると便利と思います。
forで書いてみる¶
‘*’ を数値(num)分 print します。
for(i=0;i < num;i++) printf("*")
以下は、/var/log/syslog の時間ごとの出力数の集計をグラフにした例です。値($1)の数だけ ‘*’ を表示します。
% cat bar.awk
{
printf("%s ", $0)
for(i=0;i < $1;i++) printf("*")
printf("\n")
}
% awk -F: '{print $1}' /var/log/syslog|uniq -c|awk -f bar.awk
16 Apr 21 10 ****************
46 Apr 21 11 **********************************************
25 Apr 21 12 *************************
38 Apr 21 13 **************************************
3 Apr 21 14 ***
substr()を使ってみる¶
forの代わりに組み込み関数 substr() を使用した処理を記述します。substr() は対象文字列の開始位置から長さ分の文字列を返す関数です。
substr()の引き数と返り値は以下の通り。
substr(対象文字列,開始位置、長さ)
返値: 変換文字列
表示する棒グラフを最初に定義して、1文字目から数値分切り出して表示します。棒グラフ bar は 5ドットごとに目盛りを付けています。
bar ="....o....1....o....2....o....3....o....4....o....5"
substr(bar,1、num)
/var/log/syslog の時間ごとの出力数の集計をグラフにすると以下のようになります。
% cat bar2.awk
{
bar ="....o....1....o....2....o....3....o....4....o....5"
printf("%s %s\n", $0, substr(bar,1,$1))
}
% awk -F: '{print $1}' /var/log/syslog|uniq -c|awk -f bar.awk
16 Apr 21 10 ....o....1....o.
46 Apr 21 11 ....o....1....o....2....o....3....o....4....o.
25 Apr 21 12 ....o....1....o....2....o
38 Apr 21 13 ....o....1....o....2....o....3....o...
3 Apr 21 14 ...
substr()を使った棒グラフは bar で定義した文字列以上に棒グラフは書かれないのでデータが大きすぎても画面を崩すことがありません。for の例だと数値が大きくても “*”を表示し続けます。