AWK演習2
前回で、UNIX上でAWKをどうやって実行するのかは分かったと思います。
今回は、文字の連結の練習として、集計した個数分だけ階級別にヒストグラムとして出力していくことにします。
つまり、ある階級に属する個数分だけ、ある文字列を出力するという形式でプログラムを組んでいくというわけです。
前のプログラムに少し手を加えるだけでできますね。
文字の連結は空白で区切ることによって、自動的に連結されるということを思い出しましょう。
文字は””で囲むことによって認識されます。
これを使えば…。
ここでも前回用いた、日本人男性の身長のデータ
japanmenheight1.data(<−クリックしてダウンロードしてください)
を利用することにします。
(コピーアンドペーストで、Muleなどのエディタにでも貼り付けて保存してください。)
以下でプログラム例を示します。
{
for (i = 1; i <= NF; i++) {
$i=int($i/5)*5
ast[$i]=ast[$i] "*"
}
}
END {
for (i in ast) {
print i "-" i+5, ast[i]
}
}
<解説>
ほとんど、前回のプログラムと同じです。
前回は配列を用いて、+1していく、つまりカウントしていったわけですが、
今回は配列astに、カウントする代わりに*を付加していくわけです。
あとは前回の解説を参考にしてください。
このプログラムを例えば、height2.awkという名前で保存します。
すると次のような結果になったと思います。
(以下は実行例)
user:~/awk% awk -f height2.awk japanmenheight1.data | sort
140-145 *
145-150 *
150-155 *
155-160 ****************
160-165 *************************
165-170 *************************************
170-175 **********************************
175-180 *************************
180-185 ********
185-190 **
それぞれの階級で、ヒストグラムができていることが分かります。
ところが、このプログラムには欠陥があります。
japanmenheight1.dataはデータの個数が150だからよかったんですが、
次のデータ
japanmenheight2.data(<−クリックしてダウンロードしてください)
を実行してみてください。
同じ身長のデータなんですが、今度はデータ数が600個の場合です。
すると、以下のように階級ごとに一行に、*が収まりきらず次の行にはみだしているので、これではすごい見にくいです。
user:~/awk% awk -f height2.awk japanmenheight2.data | sort
145-150 *
150-155 ***
155-160 ******************************************
160-165 *********************************************************
***************************
165-170 *********************************************************
*****************************************************************
**********************************************
170-175 *********************************************************
*****************************************************************
*************************************
175-180 *********************************************************
*************************************************
180-185 *************************
185-190 **********
190-195 **
これは、データの分布を見るという本来の目的を失っているわけです。
次の演習で、この欠陥を修正することにします。
演習3に進む
AWKの文法のページに戻る
もとのホームページに戻る