如何强制 AWK 将字符串计算为数学表达式?

aba*_*ter 5 math awk evaluate

有没有办法将字符串计算为 awk 中的数学表达式?

balter@spectre3:~$ echo "sin(0.3) 0.3" | awk '{print $1,sin($2)}'
sin(0.3) 0.29552
Run Code Online (Sandbox Code Playgroud)

我想知道一种将第一个输入计算为 0.29552 的方法。

Ed *_*ton 6

您可以创建自己的 eval 函数,它再次调用 awk 来执行您想要的任何命令:

$ cat tst.awk
{ print eval($1), sin($2) }

function eval(str,      cmd,line,ret) {
    cmd = "awk \047BEGIN{print " str "; exit}\047"
    if ( (cmd | getline line) > 0 ) {
        ret = line
    }
    close(cmd)
    return ret
}

$ echo 'sin(0.3) 0.3' | awk -f tst.awk
0.29552 0.29552

$ echo '4*7 0.3' | awk -f tst.awk
28 0.29552

$ echo 'tolower("FOO") 0.3' | awk -f tst.awk
foo 0.29552
Run Code Online (Sandbox Code Playgroud)


Buv*_*inJ 5

这是一个简单的衬里!

math(){ awk "BEGIN{printf $1}"; }
Run Code Online (Sandbox Code Playgroud)

使用示例:

math 1+1  
Run Code Online (Sandbox Code Playgroud)

产量“2”

math 'sqrt(25)'
Run Code Online (Sandbox Code Playgroud)

产量“5”

x=100; y=5; math "sqrt($x) + $y"
Run Code Online (Sandbox Code Playgroud)

产量“15”