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 中,它将这两个数字相除并给出输出。但是,使用上面的文本,它将为上面的文本输出 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

4

1 回答 1

0

您的脚本每次都会初始化numerator和值。denominator所以第二次的结果将是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
于 2013-04-21T22:40:54.490 回答