#!/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文は、日付が1桁の場合に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