我希望以下awk脚本将gpa打印为浮点数。因此文件my_course.txt中的文本看起来像
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的值添加到变量分母。然后在END中它将这两个数字分开并给出一个输出。但是,使用上面的文本,它将为上面的文本而不是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
答案 0 :(得分: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