#!/bin/bash #quiz2-2.shを実行する前にquiz2-1.shを実行していない場合のエラー表示。  if [ ! -e ./kadai2_1_data/all.csv ]; then echo 'quiz2-2.shを実行する前にquiz2-1.shを実行してください。' else #4パターンとも処理は同じで、コマンドのオプションと単位だけが違うのでそれぞれの値を変数に代入しておく。  echo '表示したい値の番号を入力してください' echo '1.日最高気温 2.日最低気温 3.日積算降水量 4.日最小湿度' read select case $select in 1) echo '日最高気温' a=8 b=7 c=5 d='-r' e='℃ ' ;; 2) echo '日最低気温' a=9 b=8 c=5 d='-r' e='℃ ' ;; 3) echo '日積算降水量' a=4 b=3 c=5 d='-r' e='mm' ;; 4) echo '日最小湿度' a=11 b=10 c=5 d='' e='%' ;; *) echo '1〜4以外の文字が入力されました やり直してください' exit ;; esac #「同じ値を記録した年月日があった場合はすべて表示する」とあるので、sortコマンドでソートしてから、上位10種類の値を持つデータのランキングをheadコマンドで抜き出して作りたい。だが、重複も含めて上から何個のデータを取り出せばいいのかが分からない。以下はその個数($kosuu)を求める処理。 file=./kadai2_1_data/all.csv kosuu=0 for f in `sort -t , -k $a -n $d $file | uniq -f $b -w $c -c | head -n 10 | sed -e 's/^[ ]*//g' | cut -c 1` do kosuu=`expr $kosuu + $f` done #上で求めた$kosuuを使ってデータをheadコマンドで抜き出す。ランキングデータのそれぞれの値、年、月、日を抽出して変数に代入する。 value=($(sort -t , -k $a -n $d $file | head -n $kosuu | cut -d , -f $a)) year=($(sort -t , -k $a -n $d $file | head -n $kosuu | cut -d , -f 22 | cut -d - -f 1)) month=($(sort -t , -k $a -n $d $file | head -n $kosuu | cut -d , -f 22 | cut -d - -f 2)) date=($(sort -t , -k $a -n $d $file | head -n $kosuu | cut -d , -f 1)) point=0 while [ $point -lt $kosuu ] do #中のif文は、日付が1桁の場合に0を付加する処理。これをすることによって、ランキングの表示のバラつきを防げる。 if [[ ${date[$point]} =~ ^[0-9]$ ]] then date[$point]=0${date[$point]} fi #年月日と観測値を並べて表示させる。 echo "${year[$point]}年${month[$point]}月${date[$point]}日 ${value[$point]}$e" point=`expr $point + 1` done fi