モチベーション
パーセンタイルを出したいとき、
Rなら
score <- seq(0,100)
summary(score)
quantile(score, 0.5)
などで一発ですが、これをAWKでやってみました。
seq 1 100 |
awk 'BEGIN{min="inf"}{
if(max<$1) max=$1;
if(min>$1) min=$1;
percentile[NR]=$1}
END{asort(percentile);
print max,
percentile[int(NR*0.75)],
percentile[int(NR*0.5)],
percentile[int(NR*0.25)],
min
}'
工夫したところ
ついでのつもりでやった最小値で苦労しました…
min
は何かしら入力データの最小値よりも大きな数値を指定しないといけないのですが、
具体的な数値を入力するには入力データの最大値がわかっていないといけません。
これは面倒なので取りうる値の最大値である"inf"
を代入することにしました。
追記
asort
がGNU拡張のため, POSIX準拠は以下のようになります.
yes | head -n 100 | awk '{print NR}' | # seqコマンドのPOSIX代替
sort -n |
awk 'BEGIN{min="inf"}{
if(max<$1) max=$1;
if(min>$1) min=$1;
percentile[NR]=$1}
END{
print max,
percentile[int(NR*0.75)],
percentile[int(NR*0.5)],
percentile[int(NR*0.25)],
min
}'