#このスクリプトは準備段階のスクリプト「quiz2jyunbi.sh」を実行した後に使用するスクリプトである。 #〈方針〉 #はじめに「all.csv」というファイルにすべてのデータをまとめ、そのデータ群を知りたい値に応じた順位に並べ替え、その上位10個を抜き出せば、各ベスト10/ワースト10を示すことができる。 #知りたいランキングは1〜4の数字入力により行う。それ以外の数字を入力した場合はエラー表示される。 #以下、スクリプト本文 #!/bin/bash #準備段階スクリプトで作成した「kadai2jyunbi_data」のすべてのデータをall.csvにまとめる cat `ls ./kadai2matome_data/*` > all.csv #スクリプト実行者が知りたいランキングを番号で入力させる。 echo 表示したい値の番号を入力してください echo 1.日積算降水量 2.最高気温 3.最低気温 4.最低湿度 read number #入力された番号が1,2,3,4,それ以外 のいずれかによって場合分けする。 #1が入力された場合 case "$number" in 1) #all.csvのデータで「,」を区切りとして4区分目の数値、つまり降水量が大きい順に行を並び替える。 sort=`sort -t , -k 4,4 -n -r ./all.csv` #「年」「月」「日」「降水量」を切り取り、それぞれ「year.csv」,「month.csv」,「day.csv」,「kousuiryou.csv」という新規ファイルに挿入する。 echo -n "$sort\n" | cut -d , -f 22 > year.csv echo -n "$sort\n" | cut -d , -f 23 > month.csv echo -n "$sort\n" | cut -d , -f 1 > day.csv echo -n "$sort\n" | cut -d , -f 4 > kousuiryou.csv #ここで、a,b,cの値を定めておく。 a=1 b=1 c=2 #aが11以上になるまで、以下の試行を繰り返す while [ $a -lt 11 ] do #降水量のデータのb行目とc行目の値を抜き出して比較する。 numberb=`sed -n "${b}p" kousuiryou.csv` numberc=`sed -n "${c}p" kousuiryou.csv` result=`echo "$numberb > $numberc" | bc` if [ $result = 1 ] #まず、b行目の値のほうがc行目の値よりも大きい場合 then #rank.csvという新規ファイルに、順位すなわちaを挿入する。 echo $a >> rank.csv #bとcの値を1ずつ増やす b=`expr $b + 1` c=`expr $c + 1` #次の行の順位はb位になるので、aにbの値を代入する。 a=$b #一方、b行目とc行目の値が等しい場合 else #同様の操作を行う。 echo $a >> rank.csv b=`expr $b + 1` c=`expr $c + 1` #次の行の順位はa位のままなので、aの値を変える必要はない。 fi done #a-1行目までを表示したいので、1〜a-1行目までを新規ファイルにそれぞれ抜き出す。 d=`expr $a - 1` sed -n "1,${d}p" year.csv > year1.csv sed -n "1,${d}p" month.csv > month1.csv sed -n "1,${d}p" day.csv > day1.csv sed -n "1,${d}p" kousuiryou.csv > kousuiryou1.csv #各データに、「位」「年」「月」「日」の単位を加えて新規ファイルに抜き出す。 sed -e 's/$/位/' rank.csv > rank2.csv sed -e 's/$/年/' year1.csv > year2.csv sed -e 's/$/月/' month1.csv > month2.csv sed -e 's/$/日/' day1.csv > day2.csv sed -e 's/$/mm/' kousuiryou1.csv > kousuiryou2.csv #最後に各ファイルを並べて表示させる。 paste rank2.csv year2.csv month2.csv day2.csv kousuiryou2.csv ;; #以下、1)の場合と同様の操作を行う。 #2が入力された場合 2) sort=`sort -t , -k 8,8 -n -r ./all.csv` echo -n "$sort\n" | cut -d , -f 22 > year.csv echo -n "$sort\n" | cut -d , -f 23 > month.csv echo -n "$sort\n" | cut -d , -f 1 > day.csv echo -n "$sort\n" | cut -d , -f 8 > saikoukion.csv a=1 b=1 c=2 while [ $a -lt 11 ] do numberb=`sed -n "${b}p" saikoukion.csv` numberc=`sed -n "${c}p" saikoukion.csv` result=`echo "$numberb > $numberc" | bc` if [ $result -eq 1 ] then echo $a >> rank.csv b=`expr $b + 1` c=`expr $c + 1` a=$b else echo $a >> rank.csv b=`expr $b + 1` c=`expr $c + 1` fi done d=`expr $a - 1` sed -n "1,${d}p" year.csv > year1.csv sed -n "1,${d}p" month.csv > month1.csv sed -n "1,${d}p" day.csv > day1.csv sed -n "1,${d}p" saikoukion.csv > saikoukion1.csv sed -e 's/$/位/' rank.csv > rank2.csv sed -e 's/$/年/' year1.csv > year2.csv sed -e 's/$/月/' month1.csv > month2.csv sed -e 's/$/日/' day1.csv > day2.csv sed -e 's/$/℃ /' saikoukion1.csv > saikoukion2.csv paste rank2.csv year2.csv month2.csv day2.csv saikoukion2.csv ;; #3が入力された場合 3) sort=`sort -t , -k 9,9 -n -r ./all.csv` echo -n "$sort\n" | cut -d , -f 22 > year.csv echo -n "$sort\n" | cut -d , -f 23 > month.csv echo -n "$sort\n" | cut -d , -f 1 > day.csv echo -n "$sort\n" | cut -d , -f 9 > saiteikion.csv a=1 b=1 c=2 while [ $a -lt 11 ] do numberb=`sed -n "${b}p" saiteikion.csv` numberc=`sed -n "${c}p" saiteikion.csv` result=`echo "$numberb > $numberc" | bc` if [ $result -eq 1 ] then echo $a >> rank.csv b=`expr $b + 1` c=`expr $c + 1` a=$b else echo $a >> rank.csv b=`expr $b + 1` c=`expr $c + 1` fi done d=`expr $a - 1` sed -n "1,${d}p" year.csv > year1.csv sed -n "1,${d}p" month.csv > month1.csv sed -n "1,${d}p" day.csv > day1.csv sed -n "1,${d}p" saiteikion.csv > saiteikion1.csv sed -e 's/$/位/' rank.csv > rank2.csv sed -e 's/$/年/' year1.csv > year2.csv sed -e 's/$/月/' month1.csv > month2.csv sed -e 's/$/日/' day1.csv > day2.csv sed -e 's/$/℃ /' saiteikion1.csv > saiteikion2.csv paste rank2.csv year2.csv month2.csv day2.csv saiteikion2.csv ;; #4が入力された場合 4) #このランキングのみ、小さい順に並べ替えを行うことでワースト10を求める。 sort=`sort -t , -k 11,11 -n ./all.csv` echo -n "$sort\n" | cut -d , -f 22 > year.csv echo -n "$sort\n" | cut -d , -f 23 > month.csv echo -n "$sort\n" | cut -d , -f 1 > day.csv echo -n "$sort\n" | cut -d , -f 11 > saiteishitsudo.csv a=1 b=1 c=2 while [ $a -lt 11 ] do numberb=`sed -n "${b}p" saiteishitsudo.csv` numberc=`sed -n "${c}p" saiteishitsudo.csv` result=`echo "$numberb < $numberc" | bc` if [ $result -eq 1 ] #b行目の値のほうがc行目の値よりも小さい時 then echo $a >> rank.csv b=`expr $b + 1` c=`expr $c + 1` a=$b #b行目とc行目の値が同じ時 else echo $a >> rank.csv b=`expr $b + 1` c=`expr $c + 1` fi done d=`expr $a - 1` sed -n "1,${d}p" year.csv > year1.csv sed -n "1,${d}p" month.csv > month1.csv sed -n "1,${d}p" day.csv > day1.csv sed -n "1,${d}p" saiteishitsudo.csv > saiteishitsudo1.csv sed -e 's/$/位/' rank.csv > rank2.csv sed -e 's/$/年/' year1.csv > year2.csv sed -e 's/$/月/' month1.csv > month2.csv sed -e 's/$/日/' day1.csv > day2.csv sed -e 's/$/%/' saiteishitsudo1.csv > saiteishitsudo2.csv paste rank2.csv year2.csv month2.csv day2.csv saiteishitsudo2.csv ;; #1~4以外が入力された場合(エラー表示) *) echo 1,2,3,4のいずれかを入力してください。 ;; esac