#!/bin/bash cat `ls ./kadai2-2_data/*` > all.csv #事前に別のシェルスクリプトで作っておいたディレクトリ「kadai2-2_data」以下のファイルをすべてall.csvにまとめる #all.csvの1行あたりが各日の気象データとなっている #全データがまとめられたall.csv内を知りたい値に従って並び替えてランキングを行い、その上位10行を抜き出せば、各ベスト10が現れる。 #ただし、ベスト/ワースト10の中に同じ値を記録した年月日があった場合にはすべて表示しなければならないので少々手を加えないといけない word=$1 while : do tmax="日最高気温" tmin="日最低気温" ame="日積算降水量" sitsu="日最小湿度" #まず、tmax,tmin,ame,sitsuという変数にそれぞれ「日最高気温」、「日最低気温」、「日積算降水量」、「日最小湿度」という文字を代入した。 case $# in 1) #入力された引数が一つだった時。 if [ $word = "$tmax" ] # ↑ この行の意味は「実行時引数が変数tmax、つまり日最高気温である場合」ということ。 then sort -t , -k 8,8 -n -r ./all.csv > all2.csv #「sort」のコマンドによりall.csvの各行のデータで、「,」を区切りとして8区分目の数値、つまり日最高気温が大きい順に行を並び替える。 cut -d " " -f8 all2.csv > tmax.csv #温度だけのデータを抜き出してtmax.csvというファイルに保存する。 a=10 b=11 #データの10個目と11個目の値を比べる。 while : do numa=`sed -n "${a}p" tmax.csv` numb=`sed -n "${b}p" tmax.csv` result=`echo "$numa - $numb"` #最高気温のデータの10位と11位を比較する。 if [ $result -eq 0 ] then a=`expr $a + 1` b=`expr $b + 1` #10位と11位に差がなければ11位と12位を比べる。 else break #差があればループから抜け出す。 #これを繰り返して同率10位がどれだけあるか調べる。 fi done sed -n "1,${a}p" all2.csv > rank.csv #同率を含む10位までのデータを抜き出す。 #ここから、例えば日最高気温を知りたいのならこのall.csvのデータの中から「年」、「月」、「日」、「日最高気温」の数値だけを抜き出して表示すれば良い。 cut -d , -f22 rank.csv > year.csv #「,」を区切りとしてrank.csv内の22区分目の列、つまり何年のデータかを示す値だけを抜き出してyear.csvというファイルに挿入する。 sed -i -e "s/$/年/" year.csv #year.csvのファイルの各行の文末に「年」をつける。 cut -d , -f23 rank.csv > month.csv #次に、「,」を区切りとしてrank.csv内の23区分目の列、つまり何月のデータかを示す値だけを抜き出してmonth.csvというファイルに挿入する。 sed -i -e "s/$/月/" month.csv #month.csvのファイルの各行の文末に「月」をつける。 cut -d , -f1 rank.csv > date.csv #次に、「,」を区切りとしてrank.csv内の1区分目の列、つまり何日のデータかを示す値だけを抜き出してdate.csvというファイルに挿入する。 sed -i -e "s/$/日/" date.csv #date.csvのファイルの各行の文末に「日」をつける。 cut -d , -f8 rank.csv > tmax2.csv #次に、「,」を区切りとしてrank.csv内の8区分目の列、つまり最高気温が何℃ かを示す値だけを抜き出してtamx.csvというファイルに挿入する。 sed -i -e "s/$/℃/" tmax2.csv #tmax.csvのファイルの各行の文末に「℃ 」をつける。 paste year.csv month.csv date.csv tmax2.csv #コマンド「paste」によって、各ファイルを横に結合して表示する #この結果、日最高気温について知りたい場合、同率を含む上位10位のデータの年月日、最高気温の値が表示される。 break elif [ $word = "$tmin" ] #実行時引数が日最低気温の場合も、上記の日最高気温の場合と同じような手順を行う。 then sort -t , -k 9,9 -n ./all.csv > all2.csv cut -d " " -f9 all2.csv > tmin.csv a=10 b=11 while : do numa=`sed -n "${a}p" tmin.csv` numb=`sed -n "${b}p" tmin.csv` result=`echo "$numa - $numb"` if [ $result -eq 0 ] then a=`expr $a + 1` b=`expr $b + 1` else break fi done sed -n "1,${a}p" all2.csv > rank.csv cut -d , -f22 rank.csv > year.csv sed -i -e "s/$/年/" year.csv cut -d , -f23 rank.csv > month.csv sed -i -e "s/$/月/" month.csv cut -d , -f1 rank.csv > date.csv sed -i -e "s/$/日/" date.csv cut -d , -f9 rank.csv > tmin2.csv sed -i -e "s/$/℃/" tmin2.csv paste year.csv month.csv date.csv tmin2.csv break elif [ $word = "$ame" ] #実行時引数が日積算降水量の場合も、上記の日最高気温の場合と同じような手順を行う。 then sort -t , -k 4,4 -n -r ./all.csv > all2.csv cut -d " " -f4 all2.csv > ame.csv a=10 b=11 while : do numa=`sed -n "${a}p" ame.csv` numb=`sed -n "${b}p" ame.csv` result=`echo "$numa - $numb"` if [ $result -eq 0 ] then a=`expr $a + 1` b=`expr $b + 1` else break fi done sed -n "1,${a}p" all2.csv > rank.csv cut -d , -f22 rank.csv > year.csv sed -i -e "s/$/年/" year.csv cut -d , -f23 rank.csv > month.csv sed -i -e "s/$/月/" month.csv cut -d , -f1 rank.csv > date.csv sed -i -e "s/$/日/" date.csv cut -d , -f4 rank.csv > ame2.csv sed -i -e "s/$/mm/" ame2.csv paste year.csv month.csv date.csv ame2.csv break elif [ $word = "$sitsu" ] #実行時引数が日最小湿度の場合も、上記の日最高気温の場合と同じような手順を行う。 then sort -t , -k 11,11 -n ./all.csv > all2.csv cut -d " " -f11 all2.csv > sitsu.csv a=10 b=11 while : do numa=`sed -n "${a}p" sitsu.csv` numb=`sed -n "${b}p" sitsu.csv` result=`echo "$numa - $numb"` if [ $result -eq 0 ] then a=`expr $a + 1` b=`expr $b + 1` else break fi done sed -n "1,${a}p" all2.csv > rank.csv cut -d , -f22 rank.csv > year.csv sed -i -e "s/$/年/" year.csv cut -d , -f23 rank.csv > month.csv sed -i -e "s/$/月/" month.csv cut -d , -f1 rank.csv > date.csv sed -i -e "s/$/日/" date.csv cut -d , -f11 rank.csv > sitsu2.csv sed -i -e "s/$/%/" sitsu2.csv paste year.csv month.csv date.csv sitsu2.csv break else echo '項目名が間違っています。' #実行時引数が日最高気温、日最低気温、日積算降水量、日最小湿度のどれでもない場合、コマンド「echo」によって「項目名が間違っています。」という文を表示する。 echo '日最高気温、日最低気温、日積算降水量、日最小湿度のどれかを入力してください。' read word fi;; *) echo '引数が入力されていない、または2つ以上入力されています。' echo '日最高気温、日最低気温、日積算降水量、日最小湿度のどれかを入力してください。' read word;; esac done