2013-03-28 120 views
0

我想要下面的awk腳本將gpa打印出來作爲浮點數。所以在文件my_course.txt文本看起來像Awk打印整數而不是浮點數

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

應該檢查,看看是否在4場數爲1,如果這樣的話通過乘場3時間字段5無論是4,3,或2根據它是A,B還是C.然後把這個值加到分子上。對於分母它只會將字段3的值添加到可變分母。然後在結束時它會分開這兩個數字並給出一個輸出。但是,使用上面的文本,它會輸出3代替3.5的文本。我假設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

+0

什麼是分子和分母? (我指的是實際值。我知道的術語的意思。) – danfuzz

+0

的實際值以上所列應分子= 21和分母= 6.對於計算爲分子=(3 * 4)+(3×3的文件)。對於分母= 3 + 3.但分子打印出9.000000,分母打印出3.000000。 – thad

+0

我在腳本的開頭設置分母和分子等於零。所以每次運行它都會丟失以前的值並添加新的值。因此分子爲9.000000,分母爲3.000000。因爲在最後一行3是字段4和字段5中的值,所以B的值轉換爲3.我覺得自己像個白癡。感謝讓我真的認爲要檢查打印語句中的值。 – thad

回答

0

你的初始化腳本每次numeratordenominator值。所以第二次結果將是numerator=3*B,denominator+=3。所以結果是3.我假設你想總結這些值,所以結果將是numerator=3*A+3*B,denominator=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