更新
AWKプログラミング(応用編)
小山智史
14. BMI早見表
基礎編で度々登場したBMIですが、ここではBMIの早見表を作ってみます。身長と体重を変えながら、BMIを計算して表にします。
bmitable.awk:
BEGIN{
s="cm/kg"
for(w=45; w<=70; w+=5) s=s "\t" w
print s
for(h=150; h<=185; h+=5){ # 身長(h)を変える
s=h
for(w=45; w<=70; w+=5){ # 体重(w)を変える
BMI=bmicalc(h,w)
s=s "\t" mark(BMI) BMI
}
print s
}
}
function bmicalc(h,w){
x=w*10000/(h*h)
return int(x*10+0.5)/10
}
function mark(x){
if(x>=26.4) return "●"
else if(x>=24.2) return "○"
else if(x>=19.8) return "◎"
else return "△"
}
|
C>gawk -f bmitable.awk
cm/kg 40 45 50 55 60 65 70
150 17.7 20 22.2 24.4 26.6 28.8 31.1
155 16.6 18.7 20.8 22.8 24.9 27 29.1
160 15.6 17.5 19.5 21.4 23.4 25.3 27.3
165 14.6 16.5 18.3 20.2 22 23.8 25.7
170 13.8 15.5 17.3 19 20.7 22.4 24.2
175 13 14.6 16.3 17.9 19.5 21.2 22.8
180 12.3 13.8 15.4 16.9 18.5 20 21.6
185 11.6 13.1 14.6 16 17.5 18.9 20.4
C>
|
以下は、2cm/2kg刻みにし、AWKプログラムでHTMLファイルを作り、ブラウザで表示させたものです。文字の表示色もBMIの値によって変わるようにしています。
bmitable.awk:
function bmicalcx(h,w, x){
x=w*10000/(h*h)
x=int(x*10+0.5)/10
if(x>=26.4) return "" x ""
else if(x>=24.2) return "" x ""
else if(x>=19.8) return "" x ""
else return "" x ""
}
BEGIN{
print ""
print "BMI早見表"
print "cm/kg | "
for(w=40; w<=70; w+=2) printf "" w " | "
print " "
for(h=150; h<=185; h+=2){ # 身長(h)を変える
printf "" h " | "
for(w=40; w<=70; w+=2){ # 体重(w)を変える
x=bmicalcx(h,w)
printf "" x " | "
}
print " "
}
print " "
}
|
C>gawk -f bmitable.awk
<!DOCTYPE html><html>
<h2>BMIの早見表</h2>
...
C>gawk -f bmitable.awk >bmitable.html
C>bmitable.html
C>
|
上記の操作は、はじめは単にAWKプログラムbmitable.awkを実行したもので、画面にHTMLコードが表示されます。次にリダイレクトでbmitable.htmlを作り、最後の操作で、ブラウザに次のような早見表が表示されます。
cm/kg |
40 | 42 | 44 | 46 | 48 | 50 | 52 | 54 | 56 | 58 | 60 | 62 | 64 | 66 | 68 | 70 |
150 | 17.8 | 18.7 | 19.6 | 20.4 | 21.3 | 22.2 | 23.1 | 24 | 24.9 | 25.8 | 26.7 | 27.6 | 28.4 | 29.3 | 30.2 | 31.1 |
152 | 17.3 | 18.2 | 19 | 19.9 | 20.8 | 21.6 | 22.5 | 23.4 | 24.2 | 25.1 | 26 | 26.8 | 27.7 | 28.6 | 29.4 | 30.3 |
154 | 16.9 | 17.7 | 18.6 | 19.4 | 20.2 | 21.1 | 21.9 | 22.8 | 23.6 | 24.5 | 25.3 | 26.1 | 27 | 27.8 | 28.7 | 29.5 |
156 | 16.4 | 17.3 | 18.1 | 18.9 | 19.7 | 20.5 | 21.4 | 22.2 | 23 | 23.8 | 24.7 | 25.5 | 26.3 | 27.1 | 27.9 | 28.8 |
158 | 16 | 16.8 | 17.6 | 18.4 | 19.2 | 20 | 20.8 | 21.6 | 22.4 | 23.2 | 24 | 24.8 | 25.6 | 26.4 | 27.2 | 28 |
160 | 15.6 | 16.4 | 17.2 | 18 | 18.8 | 19.5 | 20.3 | 21.1 | 21.9 | 22.7 | 23.4 | 24.2 | 25 | 25.8 | 26.6 | 27.3 |
162 | 15.2 | 16 | 16.8 | 17.5 | 18.3 | 19.1 | 19.8 | 20.6 | 21.3 | 22.1 | 22.9 | 23.6 | 24.4 | 25.1 | 25.9 | 26.7 |
164 | 14.9 | 15.6 | 16.4 | 17.1 | 17.8 | 18.6 | 19.3 | 20.1 | 20.8 | 21.6 | 22.3 | 23.1 | 23.8 | 24.5 | 25.3 | 26 |
166 | 14.5 | 15.2 | 16 | 16.7 | 17.4 | 18.1 | 18.9 | 19.6 | 20.3 | 21 | 21.8 | 22.5 | 23.2 | 24 | 24.7 | 25.4 |
168 | 14.2 | 14.9 | 15.6 | 16.3 | 17 | 17.7 | 18.4 | 19.1 | 19.8 | 20.5 | 21.3 | 22 | 22.7 | 23.4 | 24.1 | 24.8 |
170 | 13.8 | 14.5 | 15.2 | 15.9 | 16.6 | 17.3 | 18 | 18.7 | 19.4 | 20.1 | 20.8 | 21.5 | 22.1 | 22.8 | 23.5 | 24.2 |
172 | 13.5 | 14.2 | 14.9 | 15.5 | 16.2 | 16.9 | 17.6 | 18.3 | 18.9 | 19.6 | 20.3 | 21 | 21.6 | 22.3 | 23 | 23.7 |
174 | 13.2 | 13.9 | 14.5 | 15.2 | 15.9 | 16.5 | 17.2 | 17.8 | 18.5 | 19.2 | 19.8 | 20.5 | 21.1 | 21.8 | 22.5 | 23.1 |
176 | 12.9 | 13.6 | 14.2 | 14.9 | 15.5 | 16.1 | 16.8 | 17.4 | 18.1 | 18.7 | 19.4 | 20 | 20.7 | 21.3 | 22 | 22.6 |
178 | 12.6 | 13.3 | 13.9 | 14.5 | 15.1 | 15.8 | 16.4 | 17 | 17.7 | 18.3 | 18.9 | 19.6 | 20.2 | 20.8 | 21.5 | 22.1 |
180 | 12.3 | 13 | 13.6 | 14.2 | 14.8 | 15.4 | 16 | 16.7 | 17.3 | 17.9 | 18.5 | 19.1 | 19.8 | 20.4 | 21 | 21.6 |
182 | 12.1 | 12.7 | 13.3 | 13.9 | 14.5 | 15.1 | 15.7 | 16.3 | 16.9 | 17.5 | 18.1 | 18.7 | 19.3 | 19.9 | 20.5 | 21.1 |
184 | 11.8 | 12.4 | 13 | 13.6 | 14.2 | 14.8 | 15.4 | 15.9 | 16.5 | 17.1 | 17.7 | 18.3 | 18.9 | 19.5 | 20.1 | 20.7 |
15. 文書整形
15.1 データの一覧表示
sumo.csv から一覧表のHTMLファイルを作り、ブラウザに表示してみます。
sumotable.awk:
BEGIN{
FS=","
print ""
print "歴代の横綱"
print ""
print "名前 | 出身地 | 身長(cm) | 体重(kg) | "
}
{
print "" $1 " | " $2 " | " $3 " | " $4 " | "
}
END{
print " "
print " |