2010-11-27 31 views
2

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

我在一个文件中有这个。

1*2*3 
1+2*3 

AWK应输出6,7,如果该文件的传递。

+1

没有awk:`while read line;做echo $ [line];完成 khachik 2010-11-27 16:37:12

+0

@khachik - 这是一个简单的例子。实际文件包含2列 - 6 1 * 2 * 3等等,我必须在评估之前拆分这一行。 – Fakrudeen 2010-11-27 17:01:59

+0

你可以用`awk`或别的东西来分割,然后评估算术运算。 – khachik 2010-11-27 17:03:37

回答

3

awk(1)是因为它不具有eval()功能错误的工具。我建议修改文件进入输入bc(1)或使用shell算术扩展:

while read expr; do 
    echo "$(($expr))" 
done < file 
1
  1. awk没有的eval()功能可按
  2. 使用BC或外壳算术扩张既可以把它
  3. 但如果您在Hadoop脚本使用它,考虑子进程的问题

此外,你可以尝试以下方法:

  1. 考虑写在AWK的expression evaluatorfrom archive.org,搜索CALC3
  2. 使用eval
  3. 使用Python的eval函数
-1

举个例子,考虑什么iftop为您提供:

Host name     last 2s last 10s last 40s cumulative 

    1 10.150.1.1  =>  650B  533B  533B  2.08KB 
    85.239.108.20 <=  16.0KB 12.9KB  12.9KB 51.5KB 

假设您需要2条上/下行到一行并将KB/B计算为正确的字节值(* 1024)。你可以有这样的:

iftop -i eth1 -ts 10 -Bn|egrep "<|>"| sed 's/^ //g;s/^[1-9]/x/g;s/KB/ 1024/g;s/B/ 1/g' | tr -d '\n'|tr "x" '\n'| grep .| awk '{print $1" "$11" - "$9*$10+$19*$20" "$9*$10" "$19*$20 }' 
0

我知道这是可怕的,但我们可以:

awk '{system(sprintf("awk \"BEGIN {print " $0 "}\""))}' 

如指出,BC,Python中的eval,庆典$(()),更好的解决方案

最后一个建议Perl:

perl -nE 'say eval'