【问题标题】:Comparing numbers with awk用 awk 比较数字
【发布时间】:2022-11-01 14:05:04
【问题描述】:

编辑:感谢詹姆斯布朗找到了答案,我格式化命令的方式存在问题:

awk -F"," '{ if ($2*$3 > 0.5) print }'

正在工作中。

我有一个这样的文件:

1000,0.5,1
2000,0.5,3
4000,1,3
5000,0.2,1

我需要将每行的 $2 和 $3 相乘,并检查结果是否优于 0.5。 我读到 -gt 运算符无法处理浮点数,而 awk 可以做到。

这是我能想到的最好的:

cat awk.txt | awk -F"," '{ if ("$2"*"$3" > "0,5") print "$line"}'

当然,它不起作用,但它不会返回任何错误......

预期结果:

5000,0.2,1

你能为我指出正确的方向吗?

非常感谢

【问题讨论】:

  • "$2" 是文字字符串 $2,而不是第二个字段的值,"$line""0,5" 也是如此 - 还要注意你有逗号,这不是小数分隔符。要print 行,只需使用print。另外,不需要cat file,awk 可以处理带有awk '...' file 的文件。
  • 猫awk.txt | awk -F"," '{ if ($2*$3 > "0,5") print }' 正在工作,感谢 James Brown。
  • awk 不是 shell,它是一种完全不同的语言,就像 C 一样,有自己的语法和语义。
  • 关于EDIT: found the answer... - 不,那个脚本awk -F"," '{ if ($2*$3 > "0,5") print }' 是在进行字符串比较,而不是数字比较。您得到预期输出的事实只是巧合,尝试echo 11 | awk '{ if ($1 > "2") print }',您会看到它什么也没输出。您还在该代码中使用 , 作为小数点,但在数据中使用 . - 您的语言环境中的小数点不能同时是逗号和句点。
  • 你是对的,这是因为我们在法语中使用“0,5”而不是“0.5”。

标签: shell awk


【解决方案1】:

修复代码中的错误后:

$ awk -F"," '{if($2*$3 > 0.5) print}' file

输出是:

2000,0.5,3
4000,1,3

你也可以:

$ awk -F, '$2*$3>0.5' file

【讨论】:

    【解决方案2】:

    当然,它不起作用,但它不会返回任何错误......

    我想解释一下到底发生了什么

    awk -F"," '{ if ("$2"*"$3" > "0,5") print "$line"}'
    

    首先是将字符串$2 乘以字符串$3,这提示GNU AWK 将它们都转换为How awk Converts Between Strings and Numbers 中描述的数字,因为字符串作为整体或任何前缀都不是有效数字,以下确实适用

    不能解释为有效数字的字符串转换为零。

    因此你实际上得到了乘法

    0*0
    

    产生数字 0,然后给出以下比较

    0 > "0,5"
    

    这再次提示将字符串转换为数字,这给了0,因为00,5的最长数字构成前缀,所以最后我们得到

    0 > 0
    

    这永远不会成立,所以你得到空输出。

    【讨论】:

      【解决方案3】:
      perl -F',' -lane'print if $F[1]*$F[2]>0.5' file
      
      
      perl -lne'($a,$b)=((split/,/)[1,2]);print if $a*$b>0.5' file
      

      【讨论】:

        猜你喜欢
        • 2017-09-23
        • 1970-01-01
        • 2011-09-02
        • 1970-01-01
        • 1970-01-01
        • 2013-10-26
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多