#!/bin/bash
#kadai2_dataディレクトリ以下にall.csvファイルがあるか確認
if [ -e './kadai2_data/all.csv' ]
then

#① 4パターンとも処理は同じで、コマンドのオプションと単位だけが違う。そのため、それらを変数にし、スクリプトの最初でそれぞれの値を変数に代入しておく。　

echo '表示したい値の番号を入力してください'
echo '1.日最高気温 2.日最低気温 3.日積算降水量 4.日最小湿度'
read select
case $select in
  1) echo '日最高気温' 
     valueplace=8  uniqplace=7  order='-r' mark='℃ ' ;;
  2) echo '日最低気温' 
     valueplace=9  uniqplace=8  order='-r' mark='℃ ' ;;
  3) echo '日積算降水量' 
     valueplace=4  uniqplace=3  order='-r' mark='mm' ;;
  4) echo '日最小湿度' 
     valueplace=11 uniqplace=10 order=''   mark='%'  ;;
  *) echo '1〜4以外の文字が入力されました やり直してください'
     exit  ;;
esac

#② ここからがメインの処理。「同じ値を記録した年月日があった場合はすべて表示する」とあるので、sortコマンドでソートしてから、上位10種類の値を持つデータのランキングをheadコマンドで抜き出して作りたい。だが、headコマンドの-nオプション、つまり重複も含めて上から何個のデータを取り出せばいいのかが分からない。以下はその個数($overlap)を求める処理。

allfile=./kadai2_data/all.csv
overlap=0
for double in `sort -t , -k $valueplace -n $order $allfile | uniq -f $uniqplace -w 5 -c | head -n 10 | sed -e 's/^[ ]*//g' | cut -c 1`
do
  overlap=`expr $overlap + $double`
done

#③ 本当は② でやりたかった事がやっとできる。なぜなら、$overlapがあるから。今回は、ランキングデータのそれぞれの値、年、月、日を抽出して変数に代入する。配列として代入していることに注意。

value=($(sort -t , -k $valueplace -n $order $allfile | head -n $overlap | cut -d , -f $valueplace))
year=($(sort -t , -k $valueplace -n $order $allfile | head -n $overlap | cut -d , -f 22 | cut -d - -f 1))
month=($(sort -t , -k $valueplace -n $order $allfile | head -n $overlap | cut -d , -f 22 | cut -d - -f 2))
date=($(sort -t , -k $valueplace -n $order $allfile | head -n $overlap | cut -d , -f 1))

#④ 後は③ の配列の中身を順番に表示するだけだ。中のif文は、日付が１桁の場合に0を付加する処理(例: 7 -> 07 )。これをすることによって、ランキングの表示のバラつきを防げる。

point=0
while [ $point -lt $overlap ]
do
  if [[ ${date[$point]} =~ ^[0-9]$ ]]
  then
    date[$point]=0${date[$point]}
  fi

   echo "${year[$point]}年${month[$point]}月${date[$point]}日 ${value[$point]}$mark" 
   point=`expr $point + 1`
done

else
  echo "all.csvファイルが存在しません"
fi
