计算在awk中作为参数传递的算术表达式

计算在awk中作为参数传递的算术表达式,awk,Awk,如何计算在awk中作为参数传递的算术表达式 我有这个档案 1*2*3 1+2*3 传入此文件时,awk应输出6、7。awk(1)是错误的工具,因为它没有eval()函数。我建议将文件修改为bc(1)的输入,或使用shell算术扩展: while read expr; do echo "$(($expr))" done < file 读取expr时的;做 回显“$($expr))” 完成650B 533B 533B 2.08KB 85.239.108.20我知道这很糟糕,但我们可

如何计算在awk中作为参数传递的算术表达式

我有这个档案

1*2*3
1+2*3
传入此文件时,awk应输出6、7。

awk(1)
是错误的工具,因为它没有
eval()函数。我建议将文件修改为
bc(1)
的输入,或使用shell算术扩展:

while read expr; do
    echo "$(($expr))"
done < file
读取expr时的
;做
回显“$($expr))”
完成<文件
  • awk没有eval()函数
  • 使用bc或shell算法扩展都可以使其
  • <>但是,如果在Hadoop脚本中使用它,请考虑子过程问题 此外,您可以尝试以下方法:

  • 考虑在AWK中编写一个(,搜索calc3)
  • 使用
  • 使用Python的eval函数

  • 作为一个例子,考虑<代码> IFTop给你:

    主机名最后2秒最后10秒最后40秒累计
    110.150.1.1=>650B 533B 533B 2.08KB
    
    85.239.108.20我知道这很糟糕,但我们可以:

    awk '{system(sprintf("awk \"BEGIN {print " $0 "}\""))}'
    
    正如所指出的,bc、Python eval、bash
    $(())
    是更好的解决方案

    最后一个建议是:

    perl -nE 'say eval'
    
    这里是另一个黑客的灵感部分来自,并从反馈

    。。。这还处理通过Bash内置程序传递的
    inf
    实例,以进行搜索和替换,例如

    在一个人的
    .bashrc
    文件中,它可能对基于命令行的快速计算有用


    为了完整性,这里有一个例子,如何在(大部分)纯Awk中执行上述操作

    calc.awk

    #!/usr/bin/awk -f
    
    
    function calc(expression) {
      gsub("inf", "(2 ** 1024)", expression)
      system(sprintf("awk \"BEGIN {printf(" expression ")}\""))
    }
    
    
    {
      print calc($0)
    }
    
    。。。以及使用示例

    calc.awk <<<'1 /2'
    #> 0.5
    
    
    printf '2*2\nsqrt(9)\n' | calc.awk
    #> 4
    #> 3
    
    
    calc.awk <<'EOF'
    22 / 7
    (1 + sqrt(5)) / 2
    EOF
    #> 3.14286
    #> 1.61803
    
    
    tee -a 'input-file.txt' 1>'/dev/null' <<'EOF'
    1*2*3
    1+2*3
    EOF
    
    
    calc.awk input-file.txt
    #> 6
    #> 7
    
    calc.awk 3
    计算awk 1.61803
    tee-a“input file.txt”1>“/dev/null”7
    
    没有awk时如何:
    读行时;do echo$[line];完成@khachik-这是一个稍微简化的示例。实际文件包含2列-6 1*2*3等等,我必须在求值之前拆分行。您可以使用
    awk
    或其他方法拆分,然后求值算术运算。是的-我放弃了awk,使用了您的建议-在阅读行时;do IFS=''read-ra val@khachik:
    $[]
    不推荐使用,请使用
    $(())
    提供一个简单的示例和答案总是一个好主意。我认为海报倾向于这些答案。链接表达式编辑器calc3示例:
    echo 1+1 | awk-f~/tmp/calc3。awk
    返回
    2
    。这是一个问题还是一个答案?sry,答案,无问题
    #!/usr/bin/awk -f
    
    
    function calc(expression) {
      gsub("inf", "(2 ** 1024)", expression)
      system(sprintf("awk \"BEGIN {printf(" expression ")}\""))
    }
    
    
    {
      print calc($0)
    }
    
    calc.awk <<<'1 /2'
    #> 0.5
    
    
    printf '2*2\nsqrt(9)\n' | calc.awk
    #> 4
    #> 3
    
    
    calc.awk <<'EOF'
    22 / 7
    (1 + sqrt(5)) / 2
    EOF
    #> 3.14286
    #> 1.61803
    
    
    tee -a 'input-file.txt' 1>'/dev/null' <<'EOF'
    1*2*3
    1+2*3
    EOF
    
    
    calc.awk input-file.txt
    #> 6
    #> 7