我希望下面的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,将该值与分子相加。对于分母,它只是将字段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张
发布于 2013-04-22 06:40:54
脚本每次都会初始化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
https://stackoverflow.com/questions/15693976
复制相似问题