0

次のシェルコードがあります。

i=0
while read name pren med
do
   i=`expr $i + 1`
   while read name2 pren2 n1 n2 n3 n4 n5 n6 n7
   do
      if [ $name$pren = $name2$pren2 ]
         then
            MED[$i]=`expr $n1 + $n2 + $n3 + $n4 + $n5 + $n6 + $n7`
            MED[$i]=`echo "scale=2;${MED[$i]}/7" | bc -l `
            MED[$i]=`echo "scale=2;($med+${MED[$i]})/2" | bc -l ` 
            PERS[$i]="$name $pren ${MED[$i]}"
            *echo ${PERS[$i]} >> notefinale
      fi    
  done <$2
done <$1

このコードは、2 つのファイルから Name 、 Second Name 、およびいくつかの成績を読み取ります。その後、MED[$i] である平均グレードを評価します。とにかく、MED[$i] が > 8.5 よりも高い場合にのみ、「*」でマークされたエコーを作成したいと考えています。どうすればこれを書くことができますか?

ありがとう

4

1 に答える 1

1

bc を使用して値を 10 倍し、一時変数に格納してから 85 と比較します。

bc を使用した後も値が整数ではないという問題がある場合は、次を使用できます。

tmpvar=`printf "%0.0f" $float_value`

bash には、比較演算用の浮動小数点演算のサポートが組み込まれていないため、たとえば、乗算を実行します。

med_int=`echo "scale=0; ${MED[$i]} * 10" | bc -l`
# force into an integer
med_int=`printf "%0.0f" $med_int`
if [ $med_int -gt 85 ]; then
    echo ${PERS[$i]} >> notefile
fi
于 2012-05-18T10:28:31.800 に答える