оценивать арифметическое выражение, переданное в качестве аргумента в awk - PullRequest
3 голосов
/ 27 ноября 2010

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

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

1*2*3
1+2*3

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

Ответы [ 4 ]

3 голосов
/ 27 ноября 2010

awk(1) - неправильный инструмент, так как у него нет функции eval(). Я предлагаю изменить файл для ввода bc(1) или использовать расширение арифметики оболочки:

while read expr; do
    echo "$(($expr))"
done < file
2 голосов
/ 02 декабря 2011
  1. awk не имеет функции eval ()
  2. используйте арифметическое расширение bc или shell, и оба могут сделать это
  3. Но, если вы используете его в сценариях hadoop, рассмотрите подпроцессыпроблема

кроме того, вы можете попробовать следующие способы:

  1. Попробуйте написать оценщик выражений *1013* в AWK ( из archive.org , поиск calc3 )
  2. Использование eval
  3. Использование функции Python's eval
1 голос
/ 01 октября 2017

Я знаю, что это ужасно, но мы можем:

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

как указано, bc, Python eval, bash $(( )), лучшие решения

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

perl -nE 'say eval'
0 голосов
/ 26 октября 2016

В качестве примера рассмотрим, что 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 }'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...