#!/bin/bash line=`cat $1 | wc -l` n_member=`sed -n '1p' $1 ` # score.datの1行目を取得 n_subject=`sed -n '2p' $1` # 同じく2行目を取得 echo "今回のテストの受験者数は $n_member 人 , 教科数は $n_subject です" line_number=1 count=0 # 一度、3行目以降の1行ずつをinfoという配列に格納する while read line_temp do if test $line_number -le 2 ; then # 2行目までは無視 line_number=$((line_number + 1)) else # 3行目以降からinfo配列に1行ずつ値を設定 info[$count]=$line_temp # 下は自分で変数が正しく設定されているかどうかの確認するためのコマンド # echo $line_number $count ${info[$count]} line_number=$((line_number + 1)) count=$((count + 1)) fi done < $1 # 先ほど設定したinfoという配列を # それぞれ','を区切りに切り取って # "受験者名"という配列に格納しなおす cat /dev/null >examinees_list.txt # 受験者名だけを出力するファイルのクリア for i in "${info[@]}" # infoの要素数だけ繰り返し do name_temp=`echo "$i" | cut -d',' -f1` # 先頭のフィード(ここでは受験者名が該当)を切り出してname_tempに代入 eval $name_temp[0]=$name_temp echo "$name_temp" >> examinees_list.txt for j in `seq 1 $((n_subject + 1))` do eval $name_temp['$'j]=`echo "$i" | cut -d',' -f$((j + 1))` done done # それぞれの合計点を計算する sum=0 while read examinee # 受験者の名前の数だけ繰り返す do for i in `seq 1 $n_subject` # 1~"教科数"を繰り返す do eval sum_temp='$'{$examinee[i]} # "受験者名"という配列のi番目の教科の得点を取得 sum=$((sum + sum_temp)) done eval $examinee[$((n_subject + 1))]=$sum # $name配列の要素の最後に合計点を追加 average=$((sum / n_subject)) eval $examinee[$((n_subject + 2))]=$average # $name配列の合計点の後ろに平均点 を追加 sum=0 # 合計をリセットして次の受験者についてまた繰り返す done < examinees_list.txt # 教科名を設定 no=0 for SUBJECT in {A..W} # 教科名を教科A,B,C,…..,Wまで設定する(Xはエラーが出るのでWまで) do sub=`echo 教科 $SUBJECT` subject_name[$no]=$sub no=$((no + 1)) done echo -n '受験者の名前を入力してください: ' read findname # 入力された受験者が存在するかの判定 eval rtn='$'{${findname[0]}:-"no_exist"} # "$findname"という配列(変数)が存在しなければrtnに"no_exist"を代入 if test "$rtn" = "no_exist" ; then echo "$findname という受験者は存在しません" rm examinees_list.txt exit 1 fi echo "==== $findname さんの成績 ====" echo # 各教科の得点を表示 for i in `seq 1 $n_subject` # 教科数だけ以下を繰り返す do # "教科名" : "得点"表示 (i-1なのは配列のインデックスが0から始まるから) echo -n "${subject_name[$((i - 1))]} : " ; eval "echo "'$'{$findname[$i]}"" done echo # 平均を計算して表示 # 平均点は"受験者名[教科数+2]"の要素に入っている eval "echo "平均点 : '$'{$findname[$((n_subject + 2))]}"" # 成績順に並び替え # まず並び替えるデータをファイルに書き出す cat /dev/null >score_in.txt # score_in.txtのクリア while read temp do eval "echo "'$'{$temp[@]}" >> score_in.txt" # examinees_list.txtにある名前の配列をそれぞれすべて出力 done score_out.txt # 出力ファイルのクリア eval "sort '-k'$((n_subject + 2)) -n -r score_in.txt > score_out.txt" # 平均点のフィードについて、数字順で並べ替えて出力 # 順位の確認 rank=1 while read temp do who=`echo $temp | cut -d' ' -f1` # 読み込んだ行の受験者名をwhoに代入 if test $who = $findname ; then # "$who"が入力された名前と一致すればwhileを抜ける break else rank=$((rank + 1)) # 一致しなければ$rank(順位)をプラス1する fi done