#!/bin/bash for loop in `ls kadai1_data/data*.csv` #ワイルドカードを使ってディレクトリkadai1_dataの中にあるdata2008.csvからdata2017.csvまで順に変数loopに代入して繰り返す。 do max=`grep -n "年月日" $loop | awk -F ',' '{print NF}'` #データの中から"年月日"を含む行を抽出し、その行の列数を変数maxに代入する。maxは以下のwhile文の繰り返しの上限として用いる。 bodynumber=`grep -n -w "1/1" $loop | awk -F':' '{print $1}'` #本文が始まる行番号を変数bodynumberに代入する。 column=1 while test $column -le $max do judgeave=`grep -n "年月日" $loop | cut -d , -f $column | grep -ci "平均気温(℃)"` #データの中で、"年月日"を含む行における変数column個目の列を抽出し、それが"平均気温(℃)"と一致すれば、変数judgeaveに1を代入し、一致しなければ0を代入する。 judgedate=`grep -n "年月日" $loop | cut -d , -f $column | grep -ci "年月日"` #上と同様。 if [[ $judgeave = 1 ]] ; then columnave=$column #変数columnaveに"平均気温(℃)"と一致する列の番号を代入する。 fi if [[ $judgedate = 1 ]] ; then columndate=$column #変数columndateに"年月日"と一致する列の番号を代入する。 fi column=`expr $column + 1` done column=1 while test $column -le $max do judge=`grep -n "年月日" $loop | cut -d , -f $column | grep -ci "最高気温(℃)"` if [[ $judge = 1 ]] ; then awk -F ',' -v column=$column -v columnave=$columnave -v columndate=$columndate -v bodynumber=$bodynumber '$column>=25 && NR>=bodynumber {print $columndate"/"$column"/"$columnave;exit;}' $loop >> natsubi.csv #column、columnave、columndateはそれぞれ最高気温(℃)、平均気温(℃)、年月日の列の番号を指す。データを変数bodynumber行目から順に調べ、columnが25以上の行が現れると、その年月日と最高気温(℃)と平均気温(℃)の列の値を/で区切りnatsubi.csvに追加し、その後、次の行には行かず、awkの処理を終える。/で区切るのは区切り文字を統一するためである。 break fi column=`expr $column + 1` done done sort -k 2,2n -k 3,3n -k 5,5nr -t"/" natsubi.csv | awk -F"/" '{print NR"位 " $1"年"$2"月"$3"日 "$4"度"}' #二列目(月)を数値として、ソートし、同じであれば、次に三列目(日)を数値としてソートし、さらに同じであれば五列目(平均気温)を逆順にソートする。その後順位、単位を付け加えて画面に表示する。 rm natsubi.csv #不要なファイルの削除