计算在awk中作为参数传递的算术表达式
如何计算在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我知道这很糟糕,但我们可
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