#!/bin/sh #後々にデータの並び替えをしやすいように、与えられたデータをすべて一つのファイルにまとめたい。 #まずはそのための前準備を行う cp -r -f ./kadai2_data ./kadai2-2_data #まずはディレクトリ「kadai2_data」を中身ごとディレクトリ「kadai2-2_data」にコピーする。 #与えられたデータをひとつにまとめるが、その際年月が異なり日が同じデータ(例えば2005年3月20日と2007年11月20日)はどちらがどちらのデータなのか>判別がつかなくなってしまう。 #そこで各ファイル内の各日付のデータの後ろに、対応する年、月を加えることで判別がつくようにしたい。 for naka in `find ./kadai2-2_data/*` #コマンド「find」によりディレクトリ「kadai2-2_data」の中身を検索する。 #その中身である「○ ○ ○ ○ .csv」の全ファイル名を引数とし、その引数を変数$nakaに代入しながらdoとdoneの間のコマンドを実行する。 do csv=`echo $naka | cut -d / -f 3` #変数hg、つまりファイル名「./kadai2-2_data/ 〜〜 - … … .csv」 から「/」を区切りとして3つ目の区分「 〜〜 - … … .csv」を取り出し、その名前を>変数csvに代入する。 date=`echo $csv | cut -d . -f 1` #変数csv「 〜〜 - … … .csv」の名前から「.」を区切りとして一つ目の区分「 〜〜 - … … 」を取り出し、その名前を変数dateに代入する。 year=`echo $date | cut -d - -f 1` #変数date「 〜〜 - … … 」の名前から「-」を区切りとして一つ目の区分「 〜〜 」(つまり年の数字)を取り出し、その数字を変数yearに代入する month=`echo $date | cut -d - -f 2` #変数date「 〜〜 - … … 」の名前から「-」を区切りとして二つ目の区分「 … … 」(つまり月の数字)を取り出し、その数字を変数monthに代入する sed -i -e "s/$/,$year ,$month/" $naka #コマンド「sed」により変数naka、つまり各ファイル「○ ○ ○ ○ .csv」の中の各行の末尾に",変数year ,変数month"を付け加える done #ここまでで前準備完了 cat `ls ./kadai2-2_data/*` > all.csv #前準備で作っておいたディレクトリ「kadai2-2_data」以下のファイルをすべてall.csvにまとめる #all.csvの1行あたりが各日の気象データとなっている #全データがまとめられたall.csv内を知りたい値に従って並び替えてランキングを行い、その上位10行を抜き出せば、各ベスト10が現れる。 #ただし、ベスト/ワースト10の中に同じ値を記録した年月日があった場合にはすべて表示しなければならないので少々手を加えないといけない tmax="日最高気温" tmin="日最低気温" ame="日積算降水量" situ="日最小湿度" kara="" #まず、tmax,tmin,ame,situという変数にそれぞれ「日最高気温」、「日最低気温」、「日積算降水量」、「日最小湿度」という文字を代入した。 #変数karaには文字も代入せず空白を代入した。 if [ "$1" = "$kara" ] #  ↑ この行の意味は「実行時引数がkara、つまり実行時引数が入力されておらず空白である場合」ということ。 then echo '項目名が入力されていません' #コマンド「echo」によって「項目名が入力されていません。」という文を表示する。 rm -rf kadai2-2_data #コマンド「rm」によってディレクトリ「kadai2-2_data」を消去しておく。 #これを行わない場合、2回目以降の操作では「cp」コマンドによって、kadai2-2_data内の〜.csvの欄に新しくkadai2_dataのディレクトリができてしまいます elif [ $1 = "$tmax" ] # ↑ この行の意味は「実行時引数が変数tmax、つまり日最高気温である場合」ということ。 then sort -t , -k 8,8 -n -r ./all.csv | uniq -f7 -w5 -c > all2.csv #「sort」のコマンドによりall.csvの各行のデータで、「,」を区切りとして8区分目の数値、つまり日最高気温が大きい順に行を並び替える #同時に「uniq」のコマンドによりall.csvの各行の7番目のフィールドで5文字目までが同じである、つまり日最高気温の値が同じとなる行はそれぞれ1つを残して削除する #「-c」により行表示の際,それぞれの行の重複数も表示する #この操作は上述したような同じ値があった場合にすべて表示するために必要な手順の一つ。 sort -t , -k 8,8 -n -r ./all.csv > all2-2.csv #後のために、all2.csvのファイルとは別に、all.csvのデータを日最高気温が高い順に並び替えただけのものをall2-2.csvというファイルに挿入しておく。 sed -n '1,10p' all2.csv > all3.csv #all2.csvのデータのうち1〜10行目までを取り出してall3.csvというファイルに挿入する #先程行った「uniq」のコマンドによりこの10行の日最高気温の値は重複しておらず、日最高気温の値は10種類となっている。 cut -d " " -f7 all3.csv >all0.csv #先ほどの「-c」の効果により、all3.csv内の10行の各先頭にはその行の重複数が表示されている。 #この重複数の値だけ抜き出したい。 #そこで「cut」のコマンドにより各行先頭(空白を区切りとして7フィールド目)の重複数の値だけを抜き出してファイルall0.csvに挿入する。 tyou=`awk '{ goukei += $1 } END { print goukei }' all0.csv` #コマンド「awk」によってall0.csv内のデータを合計する。 #これにより上位10種の最高気温の値の全重複数が求まった。 #この値を変数tyouに代入する sed -n "1,$tyou p" all2-2.csv > all4.csv #今度はファイルall2-2.csvの中身の1行目から変数tyou行目だけをall4.csvというファイルに挿入する。 #すると上位10種の中に同じ値を記録した年月日があった場合にはすべて表示されているはずである。 #例えば、日最高気温について知りたい場合、上位10種の全重複数は17であり、all4.csvに挿入されるのは上位10種17個のデータとなる。 #ここから、例えば日最高気温を知りたいのならこのall4.csvのデータの中から「年」、「月」、「日」、「日最高気温」の数値だけを抜き出して表示すれば良い。 cut -d , -f22 all4.csv > all5.csv #「,」を区切りとしてall4.csv内の22区分目の列、つまり何年のデータかを示す値だけを抜き出してall5.csvというファイルに挿入する。 sed -i -e "s/$/年/" all5.csv #all5.csvのファイルの各行の文末に「年」をつける cut -d , -f23 all4.csv > all6.csv #次に、「,」を区切りとしてall4.csv内の23区分目の列、つまり何月のデータかを示す値だけを抜き出してall6.csvというファイルに挿入する。 sed -i -e "s/$/月/" all6.csv #all6.csvのファイルの各行の文末に「月」をつける cut -d , -f1 all4.csv > all7.csv #次に、「,」を区切りとしてall4.csv内の1区分目の列、つまり何日のデータかを示す値だけを抜き出してall7.csvというファイルに挿入する。 sed -i -e "s/$/日/" all7.csv #all7.csvのファイルの各行の文末に「日」をつける cut -d , -f8 all4.csv > all8.csv #次に、「,」を区切りとしてall4.csv内の8区分目の列、つまり最高気温が何℃ かを示す値だけを抜き出してall8.csvというファイルに挿入する。 sed -i -e "s/$/℃/" all8.csv #all8.csvのファイルの各行の文末に「℃ 」をつける paste all5.csv all6.csv all7.csv all8.csv #コマンド「paste」によって、各ファイルを横に結合して表示する #この結果、日最高気温について知りたい場合、上位10種17個のデータの年月日、最高気温の値が表示される。 rm -rf kadai2-2_data #コマンド「rm」によってディレクトリ「kadai2-2_data」を消去しておく。 rm all.csv rm all0.csv rm all2.csv rm all2-2.csv rm all3.csv rm all4.csv rm all5.csv rm all6.csv rm all7.csv rm all8.csv #スクリプトの実行で「all0.csv」「all2.csv」などの新しいファイルの数が多くなったので処理が終わって必要でなくなったファイルは消去する elif [ $1 = "$tmin" ] #実行時引数が日最低気温の場合も、上記の日最高気温の場合と同じような手順を行う。 then sort -t , -k 9,9 -n -r ./all.csv | uniq -f8 -w5 -c > all2.csv sort -t , -k 9,9 -n -r ./all.csv > all2-2.csv sed -n '1,10p' all2.csv > all3.csv cut -d " " -f7 all3.csv >all0.csv tyou=`awk '{ goukei += $1 } END { print goukei }' all0.csv` sed -n "1,$tyou p" all2-2.csv > all4.csv cut -d , -f22 all4.csv > all5.csv sed -i -e "s/$/年/" all5.csv cut -d , -f23 all4.csv > all6.csv sed -i -e "s/$/月/" all6.csv cut -d , -f1 all4.csv > all7.csv sed -i -e "s/$/日/" all7.csv cut -d , -f9 all4.csv > all8.csv sed -i -e "s/$/℃/" all8.csv paste all5.csv all6.csv all7.csv all8.csv rm -rf kadai2-2_data rm all.csv rm all0.csv rm all2.csv rm all2-2.csv rm all3.csv rm all4.csv rm all5.csv rm all6.csv rm all7.csv rm all8.csv elif [ $1 = "$ame" ] #実行時引数が日積算降水量の場合も、上記の日最高気温の場合と同じような手順を行う。 then sort -t , -k 4,4 -n -r ./all.csv | uniq -f3 -w7 -c > all2.csv sort -t , -k 4,4 -n -r ./all.csv > all2-2.csv sed -n '1,10p' all2.csv > all3.csv cut -d " " -f7 all3.csv >all0.csv tyou=`awk '{ goukei += $1 } END { print goukei }' all0.csv` sed -n "1,$tyou p" all2-2.csv > all4.csv cut -d , -f22 all4.csv > all5.csv sed -i -e "s/$/年/" all5.csv cut -d , -f23 all4.csv > all6.csv sed -i -e "s/$/月/" all6.csv cut -d , -f1 all4.csv > all7.csv sed -i -e "s/$/日/" all7.csv cut -d , -f4 all4.csv > all8.csv sed -i -e "s/$/mm/" all8.csv paste all5.csv all6.csv all7.csv all8.csv rm -rf kadai2-2_data rm all.csv rm all0.csv rm all2.csv rm all2-2.csv rm all3.csv rm all4.csv rm all5.csv rm all6.csv rm all7.csv rm all8.csv elif [ $1 = "$situ" ] #実行時引数が日最小湿度の場合も、上記の日最高気温の場合と同じような手順を行う。 then sort -t , -k 11,11 -n ./all.csv | uniq -f10 -w3 -c > all2.csv #,を区切りとして11区分目の数値で小さい順に並び替えたデータをall2.csvというファイルに挿入する sort -t , -k 11,11 -n ./all.csv > all2-2.csv sed -n '1,10p' all2.csv > all3.csv cut -d " " -f7 all3.csv >all0.csv tyou=`awk '{ goukei += $1 } END { print goukei }' all0.csv` sed -n "1,$tyou p" all2-2.csv > all4.csv cut -d , -f22 all4.csv > all5.csv sed -i -e "s/$/年/" all5.csv cut -d , -f23 all4.csv > all6.csv sed -i -e "s/$/月/" all6.csv cut -d , -f1 all4.csv > all7.csv sed -i -e "s/$/日/" all7.csv cut -d , -f11 all4.csv > all8.csv sed -i -e "s/$/%/" all8.csv paste all5.csv all6.csv all7.csv all8.csv rm -rf kadai2-2_data rm all.csv rm all0.csv rm all2.csv rm all2-2.csv rm all3.csv rm all4.csv rm all5.csv rm all6.csv rm all7.csv rm all8.csv else echo '項目名が間違ってます' #実行時引数が日最高気温、日最低気温、日積算降水量、日最小湿度のどれでもない場合、コマンド「echo」によって「項目名が間違っています。」という文を表示する。 rm -rf kadai2-2_data fi