#!/bin/bash echo '表示したい値の数字を入力してください' echo '1.日最高気温 2.日最低気温 3.日積算降水量 4.日最小湿度' read number #表示したいものの番号を受け取る。 case $number in 1) ichi=8 ni=7 san=5 yon='-r' go='℃ ' ;; 2) ichi=9 ni=8 san=5 yon='-r' go='℃ ' ;; 3) ichi=4 ni=3 san=5 yon='-r' go='mm' ;; 4) ichi=11 ni=10 san=5 yon='' go='%' ;; *) echo '指定できる数字は1〜4です' ; exit ; esac #入力された番号によって場合分けをしている。1〜4以外の数字が入力された場合はエラー処理。 pl=./kadai2_data/all.csv #すべてのデータが入ったファイルをplに代入しておく。 npb=0 #変数npbを0とする。 for cl in `sort -t , -k $ichi -n $yon $pl | uniq -f $ni -w $san -c |head -n 10 | sed -e 's/^[ ]*//g' | cut -c 1` do npb=`expr $npb + $cl` done #sortによって「,」で区切り「-k」で場所を指定し「-n $yon」で大きい順もしくは小さい順にソートする。そしてuniqで重複をなくし「-c」で重複した数を先頭に付け加える。この時空白ができるためあとでsedによって取り除く。headは上から10番目までを取り出し、cutで重複数を切り取っている。そしてclに代入し重複数を含めた上位10位の数の合計を出している。 value=($(sort -t , -k $ichi -n $yon $pl | head -n $npb | cut -d , -f $ichi)) year=($(sort -t , -k $ichi -n $yon $pl | head -n $npb | cut -d , -f 22 | cut -d - -f 1)) month=($(sort -t , -k $ichi -n $yon $pl | head -n $npb | cut -d , -f 22 | cut -d - -f 2)) date=($(sort -t , -k $ichi -n $yon $pl | head -n $npb | cut -d , -f 1)) #それぞれ値、年、月、日をどこを基準にソートするか指定し、先ほど求めた重複を含めた上位10位までの数値を切り取っている。 bango=0 while [ $bango -lt $npb ] #bangoがnpbまで繰り返し。 do if [[ ${date[$bango]} =~ ^[0-9]$ ]] then date[$bango]=0${date[$bango]} fi #日は1桁の場合桁がずれてしまうため便宜上10の位に0をつけて桁をあわせておく。 echo "${year[$bango]}年${month[$bango]}月${date[bango]}日 ${value[$bango]}$go" bango=`expr $bango + 1` done #whileによる繰り返しを使って年、月、日、値を重複を含めて上位10番目までを出力している。