awk打印整数而不是浮点数

时间:2013-03-28 23:31:37

标签: floating-point awk

我希望以下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

1 个答案:

答案 0 :(得分:0)

您的脚本每次都会初始化numeratordenominator值。因此第二次结果为numerator=3*Bdenominator+=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