2010-11-27 24 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'