#!/bin/bash # 実行結果は,端末上と./../results/quiz3.txt上の両方に出力されます # 引数として入力されたファイルから,成績データを一行ずつ,配列変数Line[s]として読み込みます i=1 while read Line[$i] ; do i=$(($i + 1)) done < $1 # Line[1]は受験者人数,Line[2]は教科数を表しています # 分かりやすくするために,それぞれ変数Person,変数Subjectとして再度読み込みます Person=${Line[1]} Subject=${Line[2]} # Line[i+2]はi番目の受験者の情報を表しています # 分かりやすくするために,A[i]=Line[i+2]として再度読み込みます # 受験者の名前Name[i]をA[i]から抽出します i=1 while [ $i -le $Person ] ; do A[$i]=${Line[$(($i + 2))]} Name[$i]=`echo ${A[$i]} | cut -d "," -f1` i=$(($i + 1)) done # 受験者を識別する番号をPid,教科を識別する番号をSNとします # 2次元配列は使えないので,全員の各教科の成績に通し番号Sidをつけて1次元配列として扱います # Sid=(Pid - 1) * 教科数 + SN とすると,各受験者の各教科に対してSidが一意に決まります # 各受験者の各教科の成績を,配列変数Score[Sid]として読み込みます Pid=1 while [ $Pid -le $Person ] ; do SN=1 while [ $SN -le $Subject ] ; do Sid=$(($(($(($Pid - 1)) * $Subject)) + $SN)) Score[Sid]=`echo ${A[$Pid]} | cut -d "," -f"$(($SN + 1))"` SN=$(($SN + 1)) done Pid=$(($Pid + 1)) done # 成績を出力したい受験者の名前を変数Jukenshaとして読み込みます echo "受験者の名前を入力してください" read Jukensha # Jukenshaに一致するものをName[Pid]の中から探します # 該当者が見つかれば,その人物のPidをここで変数Jidとして読み込みます # 該当者が見つからなければ,その受験者が存在しないことを表示し,終了します # Name[Pid]はPid=1からPid=Personまでしか存在しません # 見つからない場合にエラーが発生しないように,Name[Person+1]を定義しておきます Name[$(($Person + 1))]=Error Jid=1 while [ $Jukensha != ${Name[$Jid]} ] ; do # JukenshaとName[Jid]が一致しなければJidに1を加えていきます # JidがPersonより大きくなったとき,入力された受験者が存在しないことを意味しています if [ $Jid -gt $Person ] then echo "受験者 "$Jukensha" は存在しません" | tee ./../results/quiz3.txt ; exit fi Jid=$(($Jid + 1)) done # Jidで識別される,入力された受験者の成績を出力していきますi echo "受験者 $Jukensha の成績" | tee ./../results/quiz3.txt # 上で定義したSidの式のPidにJidを代入し,順にSNを代入して,各教科の成績Score[Sid]を呼び出し,出力します # 全教科の平均点を計算するために,変数Totalに各教科の点数を加えていきます SN=1 Total=0 while [ $SN -le $Subject ] ; do Sid=$(($(($(($Jid - 1)) * $Subject)) + $SN)) echo "教科$SN:${Score[$Sid]}点" | tee -a ./../results/quiz3.txt Total=$(($Total + ${Score[$Sid]})) SN=$(($SN + 1)) done # 全教科の平均点を計算し,出力します Ave=$(($Total / $Subject)) echo "全教科の平均点:$Ave点" | tee -a ./../results/quiz3.txt