Средняя операция с использованием чисел с десятичными знаками

Я хочу получить среднее число с десятичными знаками. Я написал это, но у меня появляется следующее сообщение об ошибке, когда я пишу десятичные числа:

./average.sh: line 10: 1.2: syntax error: invalid arithmetic operator (error token is ".2")

моя средняя операция:

i=1;
sum=0;

while [[ i -lt 4 ]]
    do
            read nr
            echo "scale=2; $nr" | bc -l
            sum=$((sum+nr))
            i=$((i+1))
    done
echo "scale=2; $sum / 4" | bc -l

Как я могу изменить его, чтобы принимать ввод с десятичными знаками? Спасибо.


person Dragos Dragomir    schedule 30.08.2019    source источник


Ответы (4)


Вы можете использовать bc, как показано ниже:

sum=$( echo $sum + $nr | bc -l )
person gmargari    schedule 30.08.2019
comment
я=1; сумма=0; while [[ i -lt 4 ]] do read nr sum=$( echo $sum + $nr | bc -l ) i=$((i+1)) done echo scale=2; $ сумма / 4 | bc -l результаты неверны: input:1.1,2.2,3,3; выход: 1,65 - person Dragos Dragomir; 30.08.2019

Ваш код отлично работает в моей системе (bash 4.4.20), но вам следует изменить строку 1 вашего скрипта на i=0, если вы хотите прочитать 4 числа. Было бы полезно, если бы вы также предоставили свой вклад вместе со своим сценарием.

Однако более простым способом было бы использование datamash:

datamash mean 1 # Calculate the mean of the first field

Изменить

Если вы не можете использовать datamash, вам подойдет awk:

awk '{sum += $0} END {print sum / NR}'
person dibery    schedule 30.08.2019
comment
для обычных чисел (1,2,3,4,5,...) это работает правильно, но для чисел с десятичными знаками (1.2, 2.3,....) это не работает. я не могу использовать datamash на своем сервере, мне нужно найти другой способ. Благодарность - person Dragos Dragomir; 30.08.2019
comment
Похоже, что bash не любит десятичные дроби, так как $((11/3)) возвращает 3. - person dibery; 30.08.2019
comment
@DragosDragomir Я добавил решение, используя awk. Он должен работать. - person dibery; 30.08.2019

Как говорит dibery, вам нужно изменить на i=0, если вы хотите рассчитать среднее значение для 4 чисел.

Для чтения ввода с десятичными знаками,

read -p 'Enter: ' var
nr="$( printf '%.2f' "$var" )"

не очень элегантно, но может работать...

Для суммирования, я думаю, вы не можете суммировать напрямую, как целые числа в bash, поэтому, возможно, попробуйте это

sum="$( echo "$sum+$nr" | bc)"

Для печати вывода я предпочитаю использовать этот формат.

bc -l <<< "$sum/4"
person Xiaohan Peng    schedule 30.08.2019

Мой сервер не принимает утилиты «datamash» или «bc», и я хочу суммировать числа с десятичными знаками с клавиатуры, а не из файла.

Я пробовал несколько примеров, но это не работает:

i=1; sum=0; while [[ i -le 3 ]]; do read nr; awk '{sum+=$nr} END { print "media:"; sum/i}'; i=$((i+1));done
person Dragos Dragomir    schedule 03.09.2019