0

次の awk スクリプトで gpa を浮動小数点数として出力する必要があります。したがって、ファイル my_course.txt 内のテキストは次のようになります。

CSC3320,SYSTEM LEVEL PROGRAMMING,3,1,A
CSC3210,ASSEMBLY LEVEL PROGRAMMING,3,1,B

フィールド 4 の数値が 1 であるかどうかを確認する必要があります。そうであれば、フィールド 3 の時間フィールド 5 に、A、B、または C のいずれであるかに応じて、4、3、または 2 を掛けます。次に、この値を分子に追加します。分母については、フィールド 3 の値を変数の分母に追加するだけです。次に、END でこれら 2 つの数値を除算して出力します。ただし、上記のテキストを使用すると、上記のテキストに対して 3.5 ではなく 3 が出力されます。私は awk のすべての数値が浮動小数点数であると仮定していたので、何が起こっているのか.

calculate(){  
  awk -F, '  
  BEGIN{printf "Your GPA is : "}  
  numerator = 0.0;  
  denominator = 0.0;  
  /^CSC/{  
    if($4=1) {  
         if($5=="A"){  
            numerator+=(4.0*$3);  
            denominator+=$3;  
         } else if ($5 == "B"){  
            numerator+=(3.0*$3);  
            denominator+=$3;  
         } else if ($5 == "C"){  
            numerator+=(2.0*$3);  
                denominator+=$3;  
         } else {  
           ;   
        }  
     }  
   }  
   END{print(numerator/denominator)}  
  ' my_course.txt  
}  

使用する

END{printf "%g", (numerator/denominator)}

プリント 3

END{printg "%f", (numerator/denominator)}

3.000000を印刷します

4

1 に答える 1

0

スクリプトは毎回numeratorとの値を初期化します。denominatorしたがって、2 回目の結果はnumerator=3*B,になりますdenominator+=3。したがって、結果は 3 です。値を合計すると仮定すると、結果はnumerator=3*A+3*Bdenominator=6つまり (12+9)/6 になります。一方、条件では、その値をチェック(!)せずifに値を割り当てます。$4したがって、それは常に真実です。とにかく、if文字から値への変換にハッシュを使用すると、大幅に削減できます。したがって、実用的なソリューションは次のようになります。

awk -F, 'BEGIN{printf "Your GPA is : ";V["A"]=4;V["B"]=3;V["C"]=2}
  /^CSC/ && $4==1 && $5~/^[A-C]$/ {numerator+=V[$5]*$3;denominator+=$3}
  END{print numerator/denominator}' <<EOT
CSC3320,SYSTEM LEVEL PROGRAMMING,3,1,A
CSC3210,ASSEMBLY LEVEL PROGRAMMING,3,1,B
EOT

出力:

Your GPA is : 3.5
于 2013-04-21T22:40:54.490 に答える