Как оценить арифметическое выражение, переданное в качестве аргумента в awk?
У меня есть это в файле.
1*2*3 1+2*3
awk должен выдавать 6, 7, когда этот файл передается.
awk(1) - неправильный инструмент, так как у него нет функции eval(). Я предлагаю изменить файл для ввода bc(1) или использовать расширение арифметики оболочки:
awk(1)
eval()
bc(1)
while read expr; do echo "$(($expr))" done < file
кроме того, вы можете попробовать следующие способы:
Я знаю, что это ужасно, но мы можем:
awk '{system(sprintf("awk \"BEGIN {print " $0 "}\""))}'
как указано, bc, Python eval, bash $(( )), лучшие решения
$(( ))
Последнее предложение Perl:
perl -nE 'say eval'
В качестве примера рассмотрим, что iftop дает вам:
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 }'