2010-11-27 3 views
2

Как оценить арифметическое выражение, переданное как аргумент в awk?оценить арифметическое выражение, переданное как аргумент в awk

У меня есть это в файле.

1*2*3 
1+2*3 

AWK должен вывести 6, 7, когда этот файл передается в.

+1

что о без awk: `while read line; do echo $ [line]; done 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) или с помощью арифметического расширения оболочки:

while read expr; do 
    echo "$(($expr))" 
done < file 
1
  1. AWK не имеет Eval() Funciton
  2. использования нашей эры или оболочки арифметическое расширение и может сделать его
  3. Но , если вы используете его в Hadoop сценариев, рассмотрим проблему подпроцессов

кроме того, вы можете попробовать эти способы:

  1. Рассмотрим писать в AWK в expression evaluator (from archive.org, поиск calc3)
  2. Использование eval
  3. функции 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 "}\""))}' 

как указывалось, Ьс, Python Eval, Баш $(()), являются лучшие решения

последнее предложение Perl:

perl -nE 'say eval' 
Смежные вопросы