#!/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 # "受験者名"という配列のインデックスが0の要素に受験者名を代入 echo "$name_temp" >> examinees_list.txt # 受験者名をファイルに書き出す for j in `seq 1 $((n_subject + 1))` do # "受験者名"という配列のインデックスの1以降の要素に順にinfoという配列の2フィード以降(教科得点)を代入する 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 # この時点で5教科の場合、例えば"ykawai"という配列は以下のようになっている # ykawai=(ykawai 80 85 65 75 55 360 72) # 教科名を設定 # 以下一行はダミーです subject_name[0]=0 no=1 for SUBJECT in {A..I} # 教科名を教科A,B,C,…..,Iまで設定する(実用性を兼ねて9科目まで) do subject_name[$no]=$SUBJECT 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 # "教科名" : "得点"表示 echo -n "教科 ${subject_name[$i]} : " ; 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 $_sub_select -n -r score_in.txt > score_out.txt" # 並べ替えたいフィードについて、数字順で並べ替えて出力 # 順位の確認 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