#!/bin/bash cp -r kadai1_data temp #kadai1_data内のデータをtempにコピーする。 cd temp mkdir temp2 #以下tempディレクトリで処理を行う。 ls *.csv | awk '{ printf "mv %s %02d.csv\n", $0, NR }' | sh #csvファイルをリスト化して01.csv〜47.csvと名前を変更する。行番号を用いた名前変更である。パイプ"|"でつなぎshに引き渡し実行している。 >kari.txt for i in {1..47} #ファイル名00.csv~09.csvまでを処理するために以下のように条件分けをする。 do if [ $i -le 9 ] then #1行目の日付データを除くすべてのデータを列ごとに分離する。 for a in {2..14} do cut -d , -f "$a" 0$i.csv > ./temp2/$a-0$i.txt done else for a in {2..14} do cut -d , -f "$a" $i.csv > ./temp2/$a-$i.txt done fi done cd temp2 #以下temp2ディレクトリで処理を行う。 for i in {1..47} do #ファイル名ごとに条件分岐。 if [ $i -le 9 ] then >0$i.txt #前のプロセスで「列数-」と接頭した。それぞれの列・ファイルで実行できるように条件分離。 for a in {2..14} do #「平均気温」という文字があり、「品質情報」「均質番号」という文字が無いファイルを抜き出す。条件にそぐわないものは削除する。 if [ `grep -ci "平均気温" $a-0$i.txt` -eq 0 ] then rm $a-0$i.txt else if [ `grep -ci -e "品質情報" -e "均質番号" $a-0$i.txt` -eq 1 ] then rm $a-0$i.txt else #先の条件を満たすもの(=平均気温)を元のファイル番号のファイルに出力する。 awk '{print $1}' $a-0$i.txt >> 0$i.txt fi fi done else >$i.txt for a in {2..14} do #上と同じで、「平均気温」という文字があり、「品質情報」「均質番号」という文字が無いファイルを抜き出す。条件にそぐわないものは削除する if [ `grep -ci "平均気温" $a-$i.txt` -eq 0 ] then rm $a-$i.txt else if [ `grep -ci -e "品質情報" -e "均質番号" $a-$i.txt` -eq 1 ] then rm $a-$i.txt else #上と同じく、先の条件を満たすもの(=平均気温)を元のファイル番号のファイルに出力する。 awk '{print $1}' $a-$i.txt >> $i.txt fi fi done fi done for i in {1..47} do #ファイル名による条件分岐。 if [ $i -le 9 ] #全体の行数(=NR)はデータの数より7多い。平均の際は(NR-7)で割らなければならない。 then awk '{sum+=$1}END{print sum/(NR-7)}' 0$i.txt >> kari.txt else awk '{sum+=$1}END{print sum/(NR-7)}' $i.txt >> kari.txt fi done awk '{print NR,$1}' kari.txt >kari2.txt #kari2.txtは1列目に行数(=都道府県指定数字)、2列目に平均気温が入っている。2列目を逆順に並び替えする。nで数値だと念のため指定。 sort -nr -k2 kari2.txt > kari3.txt #ソートが終わった後の行数(=都道府県指定数字)を取り出し、kari4.txtに出力 awk '{print $1}' kari3.txt > kari4.txt >kari5.txt num=1 #kari4.txt内の数字を順番に$lineに入れていく。 cat kari4.txt | while read line do #ここでもファイル番号による条件分岐がある。 if [ $line -le 9 ] then #3行目に都道府県名が入力されているのでそれを取ってくる。kari5.txtに出力。rank"位"ではうまくいかなかったので後で付け足す。 awk -F , --assign rank=$num 'NR==3 { print rank,$1}' 0$line.txt >> kari5.txt else #上と同じ。 awk -F , --assign rank=$num 'NR==3 { print rank,$1}' $line.txt >> kari5.txt fi num=$(($num + 1 )) #rankに使う数字を足して上から1・2・3・・・と並ぶようにする。 done #10位までなので11行目未満を利用する。体裁を整えつつ、1位・2位・・・と出力する。 awk 'NR<11{printf "%3s %1s %s\n",$1"位"," ",$2}' kari5.txt > kari6.txt #同じく10位までなので11行未満を利用する。体裁を整えつつ、例と同じになるように小数点3桁目の切り捨てを行う。int関数を利用し整数部分だけとしたあとに元の位に戻す。 awk 'NR<11{printf "%4.2f\n",int($2*100)/100}' kari3.txt > kari7.txt #"位"と同じく"℃"もうまくいかなかったのでここでつける。 awk '{print $1"℃"}' kari7.txt > kari8.txt #順位・都道府県名が入力されているkari6.txtとその順位に対応する平均気温が入力されたkari8.txtをつなげる。 paste kari6.txt kari8.txt >kari9.txt #結果を出力 cat kari9.txt #元のディレクトリに戻る。 cd ../.. #使用したtempディレクトリを削除し完了。 rm -r temp