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

Math 如何强制AWK将字符串作为数学表达式计算?,math,awk,evaluate,Math,Awk,Evaluate,有没有办法在awk中将字符串作为数学表达式求值 balter@spectre3:~$ echo "sin(0.3) 0.3" | awk '{print $1,sin($2)}' sin(0.3) 0.29552 我想知道一种将第一个输入计算为0.29552的方法。awk缺少eval(…)函数。这意味着您不能在awk程序初始化后根据输入进行字符串到代码的转换。好的,也许这是可以做到的,但不能不在awk中编写您自己的解析和评估引擎 我建议使用bc来完成这项工作,如 [edwbuck@phoeni

有没有办法在awk中将字符串作为数学表达式求值

balter@spectre3:~$ echo "sin(0.3) 0.3" | awk '{print $1,sin($2)}'
sin(0.3) 0.29552
我想知道一种将第一个输入计算为0.29552的方法。

awk缺少
eval(…)
函数。这意味着您不能在awk程序初始化后根据输入进行字符串到代码的转换。好的,也许这是可以做到的,但不能不在awk中编写您自己的解析和评估引擎

我建议使用
bc
来完成这项工作,如

[edwbuck@phoenix ~]$ echo "s(0.3)" | bc -l
.29552020666133957510

请注意,这需要将
sin
缩短为
s
,因为这是
bc
sine操作。

您只需创建自己的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

对于gawk版本4.1.2:

echo "sin(0.3) 0.3" | awk '{split($1,a,/[()]/);f=a[1];print @f(a[2]),sin($2)}'

使用
tolower(FOO)
也可以。

您可以尝试Perl,因为它有eval()函数

$  echo "sin(0.3)" | perl -ne ' print eval '
0.29552020666134
$
对于给定的输入

$ echo "sin(0.3) 0.3" | perl -ne ' /(\S+)\s+(\S+)/ and print eval($1), " ", $2 '
0.29552020666134 0.3
$

这里有一个简单的一行

math(){ awk "BEGIN{printf $1}"; }
使用示例:

math 1+1  
收益率“2”

Yeilds“5”


Yeilds“15”

如何使用这个
回声“sin(0.3)0.3”| awk'{match($1,/\(.*)/);print sin(substr($1,RSTART+1,RLENGTH-1)),sin($2)}'
:)我知道你想把它作为一个数学表达式来传递(我现在还没有意识到,看看文档),这是一个有趣的方法,肯尼·麦科马克(Kenny McCormack)和艾伦·林顿(Alan Linton)的
calc3
awk脚本的扩展版本在互联网上到处流传,这里有一个链接:原来的
calc3
只支持基本操作,但链接的脚本似乎可以处理sin等。
echo“sin(0.3)”|awk-f calc3.awk
产生
sin(0.3)=0.29552
echo“sin(0.3)0.3”| perl-ne'/(\S+)\S+(\S+)/和print eval($1),“,$2”
也适用于..++ve解决方案。如果OP仍然需要在
awk
only:)中进行操作,我也有同样的想法(添加了一条注释和解决方案),为什么linux没有一个健全的命令行数学库?我目前的解决方案是
m(){python-c“导入数学;打印($1);}
。我也可以使用perl。我以前的老板看到了这一点,告诉我我刚刚构建了世界上最昂贵的计算器。@abalter我认为
bc
是用于
基本计算器的,并且满足了“理智的命令行数学”“需要;但是,在Linux中进行数学运算的方法并不缺乏。我同意
s(…)
c(…)
是书写
sin
cos
的奇怪方式,可惜他们没有选择
sin(…)
cos()
。此外,人们几乎可以使用bash的
echo$($expr))
方法,只是它不支持trig。@EdwinBuck有趣的是,POSIX将bc中的函数和变量名限制为一个字母。(虽然可以使用多字母实现)@abalterwrt
为什么没有一个适用于linux的sane命令行数学库?
——因为这不是shell的用途。shell是一个调用工具的环境,它有一种小语言来帮助对这些调用进行排序。它不是一种功能齐全的编程语言,如果你试图使用它,那么你就没有抓住要点。对于采用单个数字或字符串参数的函数调用来说,这是个好主意(例如,你不能将它与
4*7
索引(“abc”、“b”)
sin(0.1+0.2)
一起使用)。顺便说一句,
[(]|[)]
=
[()]
math 'sqrt(25)'
x=100; y=5; math "sqrt($x) + $y"