首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Awk打印整数而不是浮点

Awk打印整数而不是浮点
EN

Stack Overflow用户
提问于 2013-03-29 07:31:37
回答 1查看 519关注 0票数 0

我希望下面的awk脚本将gpa打印为浮点数。因此,文件my_course.txt中的文本将如下所示

代码语言:javascript
运行
复制
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中的所有数字都是浮点数,所以这是怎么回事。

代码语言:javascript
运行
复制
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  
}  

使用

代码语言:javascript
运行
复制
END{printf "%g", (numerator/denominator)}

打印3

代码语言:javascript
运行
复制
END{printg "%f", (numerator/denominator)}

打印3.000000张

EN

回答 1

Stack Overflow用户

发布于 2013-04-22 06:40:54

脚本每次都会初始化numeratordenominator的值。所以第二次得到的结果是numerator=3*Bdenominator+=3。因此结果是3。我假设您想要对这些值求和,因此结果将是numerator=3*A+3*Bdenominator=6,即(12+9)/6。另一方面,在if条件中,您为$4赋值,而不检查(!)它的价值。因此,它永远是正确的。无论如何,使用散列进行字母到值的转换可以大大减少if。因此,一个可行的解决方案可以是:

代码语言:javascript
运行
复制
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

输出:

代码语言:javascript
运行
复制
Your GPA is : 3.5
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15693976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档