2017-01-31 16 views
0

У меня есть файл с 1800 строками, которые выглядят как этотКак рассчитать очень большие номера с Ьс в Баше

600.76 
600.66 
700.44 
566.66 
Ect.. 

Я сделал Баш скрипт для вычисления среднего значения.

Теперь я первым сделал переменную для подсчета суммарных строк столбцов, как:

Lines="$(awk 'END{print NR}' file.txt)" 

Тогда другой переменной на сумму этого столбца, как это:

Sum="$(awk '{s+1=$1}END {print s}' file.txt)" 

Наконец я Находить значит так:

Echo "scale=2 ; $Sum/$Lines" | bc 

с включенным режимом отладки Она возвращает:

+echo 'scale=2 ; 1.72161e+06/1800' 
(Standard_1): syntax error 

Я понимаю, что теперь bc не имеет научной нотации, но как мне обойти это.

Я в порядке с короткой передачей десятичной дроби, ограничивая ее до 2 или 3 мест.

+0

Почему бы не просто использовать 'awk'? – dawg

+0

как насчет просто 'awk '{sum + = $ 1} END {print sum/NR}''? – twalberg

+0

@twallberg awk возвращает научную нотацию после того, как ответ становится слишком большим. Какая исходная проблема – theloosegoos

ответ

0

Использование bc -l как для суммирования и окончательного раздела:

sum=0 
count=0 
while read number; do 
    number=$(printf "%f\n" $number) # get rid of scientific notation 
    sum=$(echo "$sum" '+' "$number" | bc -l) 
    count=$((count + 1)) 
done < input 
avg=$(echo $sum/$count | bc -l) 
echo $avg 
+0

Это приведет меня к той же ошибке, потому что сумма файла велика, она выражена в научной нотации. – theloosegoos

+0

@theloosegoos Нет, это не так. 'bc' не использует научную нотацию. Это калькулятор произвольной точности. – gudok

+0

корень проблемы заключается в том, когда добавлен столбец моего файла. Сумма настолько велика, что выражается в научной нотации. Поэтому, когда я передаю сумму столбца в bc, он будет перебрасывать ошибку, потому что она не принимает обозначение. – theloosegoos

0

Ненужные использовать AWK. Простой oneliner может выполнить эту работу.

echo "scale=2; ("$(paste -sd+ file.txt)")"/$(wc -l <file.txt)|bc 
+0

Это все равно отправляет bc в ошибку, он не может обрабатывать научную нотацию, это происходит, когда ответ проходит выше определенного значения. – theloosegoos