#!/bin/bash echo "表示したいデータの番号を入力してください 1.猛暑日の日数 2.真夏日の日数 3.夏日の日数" while true;do #表示したいデータ番号を入力させ、入力された番号を変数numberに代入する #正しい番号が入力されるまでnumberへの代入を繰り返す read number #正しい番号が入力された場合はbreak;;でループから抜け出す #そして基準となる気温(猛暑日なら35℃、真夏日なら30℃、夏日なら25℃)を変数temperatureに代入しておく #正しくない場合はbreakせずループする case $number in 1) echo "各年の猛暑日の日数は以下の通りです" temperature=35 break ;; 2) echo "各年の真夏日の日数は以下の通りです" temperature=30 break ;; 3) echo "各年の夏日の日数は以下の通りです" temperature=25 break ;; *) echo "そのような選択肢はありません 表示したいデータの番号を入力してください 1.猛暑日の日数 2.真夏日の日数 3.夏日の日数" esac done #データのあるディレクトリに移動する cd kadai2_data #各年の最高気温のデータのみを取り出す #与えられたデータは2005年から2014年のものであり、それぞれのデータファイルには年が入っているので、変数yearに2005~2014のそれぞれの値を代入し、年ごとの最高気温データのみをまとめる for year in `seq 2005 2014` do #gawkで最高気温のデータ(8列目)のみをまとめるが、コンマは必要ないので取り除く #6バイト目以降には)や}が含まれている場合があるので、8列目の左から5バイト(半角で5文字)のみを取り出す #月ごとにファイルが分かれているが、今回は月ごとに分ける必要がないので??を用いてまとめて処理する #年ごとにまとめたファイルはtemperature-????.txtとして保存しておく(????には年数が入る) gawk -F "," '{print substr($8,1,5)}' $year-??.csv >temperature-$year.txt #年ごとにまとめたファイルには1年の日数(365日または366日)分の行数が存在するので、1行目から順に読んでいく #猛暑日の日数など、調べたい日数を変数daysとして、はじめに0を代入しておく days=0 #各行の値を変数lineとして読み込む while read line; do #各行は小数を含んでいるため、普通に読み込んでもエラーが発生する #そのため、変数lineの小数点以下を切り捨て、新たな整数の変数aをつくる a=${line%.*} #基準となる温度(変数temperature)以上の日数daysを調べているので、小数点以下は四捨五入ではなく切り捨てを行う #次にif文を用いる #変数aが変数temperatureよりも大きい場合、つまり猛暑日や真夏日などの条件を満たす場合、変数daysに1を加える if [ $a -ge $temperature ] then days=`expr $days + 1` fi done < "temperature-$year.txt" #最後の行まで読み込み、猛暑日などの条件との比較が終わると結果を表示する echo "$year 年 $days 日" #以上の過程を2005年から2014年まで繰り返す done #最後に一時的に作っていた最高気温のみをまとめたファイルを消しておく rm temperature-*.txt #元のディレクトリに戻る cd ..