#!/bin/bash echo "都道府県別ゆるキャラランキングを表示します.ランキングを知りたい都道府県は?" read n #操作者に都道府県名を入力してもらう.入力してもらった都道府県名は変数「n」として格納. if [ ${#n} -ge 3 ] #都道府県名は「○○県」「○○府」などときちんと入力すれば3文字以上になるはずなので,文字数は3文字以上として制限する.(なぜ文字数に制限をつけたかはレポート内にて後述) then cat yururank.dat | grep -wsq "$n" #ゆるキャラランキングのデータは「yururank.dat」としてITPASS実習課題ページから入手.これを開き,その標準出力をgrepで入力された都道府県名が含まれる行を抽出してくる.-wは指定単語が完全一致しているもののみ抽出してくるオプション.-sはエラーメッセージ,-qは検索結果をそれぞれ画面に表示しないためのオプション.この結果として,ただし都道府県名が入力されているときは戻り値0,そうでないものが入力されている場合は戻り値1を返す. if [ "$?" -eq 0 ] #$?は戻り値.戻り値が0の場合は以下のコマンドを実行する. then cat yururank.dat | awk '{ a = a + $4 } END{print a}' > t1 #ランキングデータを開き,各行の4番目のフィールド,つまり,得票数を上から順に合計して足していく.最終的にaは全国の投票数の合計値を表す.これをt1に入力する. grep "$n" yururank.dat | awk '{ b = b + $4 } END{print b}' > t2 #同様に入力された都道府県の各得票数の合計をt2に入力する. read total1 < t1 read total2 < t2 #t1,t2に入力された値をそれぞれ変数total1,total2に代入する. rad=`echo "scale=1; 100*$total2/$total1" | bc | sed 's/^\./0\./'` #変数radにその都道府県の得票数の割合を代入する.今回は小数第1位までの計算を行う必要が有るため,bcコマンドを用いる.bcはパイプで渡された値を処理するため,echoによって計算した割合を渡す.「scale=1」は小数第1位まで表示することを指定する.整数部が0の場合は整数部が表示されないのでsedで整理する. echo "$n内のゆるキャラランキング(全国得票数中$rad%)" #ランキングのタイトルを表示する. grep -w "$n" yururank.dat | awk -F , '{printf "位 %6dpt No.%-3d %s\n", $4, $1, $2}' | sort -nr | cat -b #ランキングを表示する.grepで入力された都道府県のゆるキャラデータを抽出する.awkで各行が「<エントリーNo.>,<ゆるキャラ名>,<都道府県>,<得票数>」となっているのを「<順位> <得票数(dpt)> <エントリーNo.> <ゆるキャラ名>」と並び替える.今回の元のデータは各フィールドが「,」で区切られているため,-Fオプションで区切りを「,」で認識するように設定.%はフィールドが入る場所で「$4, $1, $2」で%に左から順に元のデータの4番目(=得票数),1番目(=エントリーNo.),2番目(=ゆるキャラ名)が入るように指定する.「%6」は6文字分のスペースをあけることを,「%-3d」は左詰めで3も自分のスペースを空け,10進法で表示するよう指示している.次に,sortでデータを並び替える.-nで一番左に書いてある数字(=得票数)が小さい順で並び替え,-rでその逆順(つまり,得票数が多い順)に並び替えるようにしている.最後にcatのオプション-bで各行に行番号を上から付けて表示するようにしている(この行番号が順位になる). else echo '存在する都道府県名を入力してください.' #戻り値が0でない,つまり「アキレス県」などの存在しない都道府県名を入力した場合には上のような注意文が表示されるようにする. fi #2つ目の条件はここまで. else echo '正しく都道府県名を入力してください.もしくは「○○県」「○○府」と正確に入力してください.' #入力されたものの文字数が3文字未満なら,上のような文が表示されるようにする. fi #1つ目の条件はここまで.