Para calcular a média tomando o argumento da linha de comando

0

A tarefa é que, se os números de entrada:

4
1
2
9
8

Saída = (soma de todos, exceto first_number_in_series) / first_number em série Em seguida, a média da saída deve ser 1+2+9+8/(first_number_in series)=20/4=5

Eu tentei o seguinte código, mas não consegui realizar a tarefa. Ficarei grato se alguém puder apontar o erro.

#!/bin/bash
sum=0
count=1
for x in $*
do
    if [ $count -eq 1 ]
    then
        p=$x
    else
        sum=$(($sum + $x))
    fi
    ((count++))
done
echo "scale=3;$sum/$p" | bc
    
por frp farhan 07.02.2016 / 19:44

3 respostas

0

Você não disse que os números são dados ao script no stdin.

Para isso, esse código funcionará:

#!/bin/bash
readarray -t x
count="${x[0]}" ; unset x[0]
for y in ${x[@]}; do (( sum+=y )); done
a="$(echo "scale=8; $sum/$count" | bc)"
LC_ALL=C printf '%0.3f\n' "$a"

Teste como este:

$ printf '%s\n' 4 1 2 9 8 | ./script
5.000
$ printf '%s\n' 6 1 2 9 8 13 25 | ./script
9.667
    
por 08.02.2016 / 00:40
2

Como você precisa de um cálculo de ponto flutuante, você acabará usando bc ou awk de qualquer maneira. Por que não usar o Awk para resolver todo o problema? Aqui está uma solução somente Awk, eu usei n para numerador ed para denominador:

$ printf "4\n1\n2\n9\n8\n" | awk '{if (NR == 1) {d = $0}; if (NR != 1) {n += $0}} END{printf "%.03f\n", n/(d*1.0)}'
5.000
    
por 07.02.2016 / 22:05
0

Você estava incluindo o primeiro número da soma e escreveu uma condição ruim:

if [ count -eq "1" ]

em vez de

if [ $count -eq 1 ]

O operador

$ permite acessar uma variável e você estava usando 1 como uma String em vez de um inteiro.

#!/bin/bash
read n
p=$n
sum=0
count=1
while [ $count -le $p ]
do
    read n
    x=$n
    count=$(($count + 1))
    sum=$(($sum + $x))
done
result='echo $sum $p | awk '{printf "%.3f", $1/$2 }''
echo $result
    
por 07.02.2016 / 20:00

Tags