コンソール上で、awkを使ってテストの点数などを10点台が何件、30点台が何件といった集計を行ってみる。 ある程度汎用性のあるように記述すると、以下のようにすることで〇桁(以下の例では2桁)での件数集計を行う。
bash
yes 'n=100;echo $(( (RANDOM % ( $n + 1 )) + 0 ))' | bash | head -1000 > test.txt # 1-100までのランダムな数字を1000件出力
awk '{sub(/.$/,0,$NF);print $NF}' test.txt | sort -n | uniq -c
shellblacknon@BS-PUB-UBUNTU-01:~$ yes 'n=100;echo $(( (RANDOM % ( $n + 1 )) + 0 ))' | bash | head -1000 > test.txt blacknon@BS-PUB-UBUNTU-01:~$ awk '{sub(/.$/,0,$NF);print $NF}' test.txt | sort -n | uniq -c 98 0 90 10 86 20 119 30 100 40 100 50 75 60 97 70 111 80 112 90 12 100
1-800までの数字に対して、100点台・200点といった風に集計する場合は、桁数の問題があるので以下のように記述するとよいだろう。
bash
yes 'n=800;echo $(( (RANDOM % ( $n + 1 )) + 0 ))' | bash | head -10000 > test.txt # 1-800までのランダムな数字を10000件出力
awk '{sub(/^.$/,0,$NF);sub(/..$/,0,$NF);printf("%d\n",($NF*10))}' test.txt | sort -n | uniq -cz
shellblacknon@BS-PUB-UBUNTU-01:~$ yes 'n=800;echo $(( (RANDOM % ( $n + 1 )) + 0 ))' | bash | head -10000 > test.txt # 1-800までのランダムな数字を10000件出力 blacknon@BS-PUB-UBUNTU-01:~$ awk '{sub(/^.$/,0,$NF);sub(/..$/,0,$NF);printf("%d\n",($NF*10))}' test.txt | sort -n | uniq -c 1220 0 1236 100 1263 200 1275 300 1250 400 1286 500 1258 600 1206 700 6 800