2013-09-17 3 views
1

У меня есть файл, который выглядит как:наиболее эффективный способ для вычисления среднего значения

Lorem ipsum dolor sit amet... 2465m 
id porttitor libero mauris at magna... 1m 
istique pretium tincidunt. V...1200m 
... 

Я хочу, чтобы вычислить (с помощью команд Unix, AWK, Grep и т.д.) суммы завершающего числа, я имею в виду (2465 + 1 + 1200 + ...)/NUMBER_OF_LINES. Каков наилучший способ сделать это?

+2

может ваша линия выглядеть 'Foo ... бар ... foo200m'? Я имею в виду непустой символ перед первой цифрой? – Kent

+0

Нет, всегда есть место – user1632454

ответ

4

Это делает его:

$ awk '{sum+=$NF+0} END{print "total sum is " sum " and average " sum/NR}' file 
total sum is 3666 and average 1222 

$NF выступает за последнее слово каждой строки. Он использует $NF+0, так что конечные m и другие символы не учитываются. Затем он сохраняет сумму в переменной sum, которая печатается в конце. Наконец, он печатает среднее значение, взятое, делящее sum на NR, которое имеет значение количества обработанных строк.

+0

Ваша команда на самом деле выводит неверное среднее значение 822 для входа OP. – dogbane

+0

вы изменили пример OP, добавили пробел, не u? ;) – Kent

+0

@dogbane 822 будет 3666/4, и я взял только три первые строки, так как '...' будет заполнен другим контентом. – fedorqui

2
awk '{sum+=$NF}END{printf "Average: %0.2f\n",sum/NR}' file 

Вход:

Lorem ipsum dolor sit amet... 2465m 
id porttitor libero mauris at magna... 1m 
istique pretium tincidunt. V...1200m 

Выход:

Average: 822.00 

Некоторые части на самом деле не имеет места и не работает с FS=" ." так что вы действительно должны были преобразовать строку.

awk '{t=$NF;gsub(/[^0-9]/,"",t);sum+=t}END{printf "Average: %0.2f\n",sum/NR}' 

Выход:

Average: 1222.00 
+0

результат неправильный, 'echo '(2465 + 1 + 1200)/3" | bc' дает '1222' на моем ноутбуке. большой «V» в последней строке является проблемой. ваш awk работает только в том случае, если 'NF' начинается с номера. – Kent

+0

@ Kent Исправлено. – konsolebox

+0

Что делать, если последний столбец 'foo300bar300m'? – Kent

4

Я хотел бы сделать это:

grep -oP '\d+(?=m\s*$)' file|awk '{_+=$0}END{printf "Avg: %0.2f\n",_/NR}' 

имеет два процесса, Grep и AWK, но он работает дело, что номер столбца/поле начинается с нецифровой символ. как:

foo123 456 ffffff100m 
xbar 222 444 bbbbb200m 
234 df343 xxxxxx300m 

с приведенным выше примером, он выводит:

Avg: 200.00 

с вашим примером выводит:

Avg: 1222.00 
+0

+1 всегда находил хороший способ выполнить эти вычисления! – fedorqui

+0

@fedorqui thx, он не описал Q хорошо. «...» запутан. если бы были пробелы, ваши и консолезоны отвечают лучше. – Kent

Смежные вопросы