プログラミングAWK 演習問題3-5

ヒストグラムの星の縮尺を変える問題。データが多すぎるときに行があふれないように……か。分布の最大値をとっておけば大丈夫かな。

{ x[int($1/10)]++
  if ( max < x[int($1/10)] )
    max = x[int($1/10)]
}

END {
    width=50
    for ( i=0; i<10; i++)
        printf(" %2d - %2d: %2d %s\n", i*10, i*10+9, x[i], rep(x[i]*width/max, "*"))
    printf("100     : %2d %s\n", x[10], rep(x[10]*width/max, "*"))
}

function rep (n,s,  t){
    while ( n-- > 0)
        t = t s
    return t
}

これ (test.awk) で

gawk 'BEGIN { srand(); for (i=0; i<10000; i++) print int(101*rand()) }' | gawk -f test.awk

おおかた希望の動作をしているのを確認した。

srand() しとかないと rand() って常に同じ結果になるのね。RANDOMIZE(TIME) とか思い出すな。

2008-01-06追記

ようやく出来たので答え合わせ。解答の方では、縮尺を調整するのは最初に決めた星の数より大きくなった時だけになってるけど、方向性は大体よさそうかな。