명령줄 인수를 통해 평균 계산

명령줄 인수를 통해 평균 계산

작업은 숫자를 입력하는 경우입니다.

4
1
2
9
8

출력 = (첫 번째 숫자를 제외한 계열의 모든 숫자의 합) / 계열의 첫 번째 숫자 그러면 출력 평균은 다음과 같아야 합니다.1+2+9+8/(first_number_in series)=20/4=5

다음 코드를 시도했지만 작업을 완료할 수 없습니다. 누구든지 오류를 지적해 주시면 매우 감사하겠습니다.

#!/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

답변1

부동 소수점 계산이 필요하므로 결국 bc 또는 awk를 사용하게 됩니다. 전체 문제를 해결하기 위해 awk를 사용하는 것은 어떨까요? 다음은 Awk에서만 작동하는 솔루션입니다. 분자에 n을 사용하고 분모에 d를 사용합니다.

$ 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

답변2

간단한 POSIX 솔루션:

average() { printf '%s\n' 'scale=2' "($*)/$#" | tr ' ' + | bc;}

그런 다음 다음과 같이 실행하십시오.

average 4 1 2 9 8

산출:4.80

답변3

표준 입력에서 스크립트에 숫자가 제공된다고 말하지 않았습니다.

이를 위해 다음 코드가 작동합니다.

#!/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"

테스트는 다음과 같습니다.

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

답변4

합계에 첫 번째 숫자를 포함하고 잘못된 조건을 작성했습니다.

if [ count -eq "1" ]

바꾸다

if [ $count -eq 1 ]

$연산자를 사용하면 변수에 액세스할 수 있으며 정수 대신 문자열로 1을 사용할 수 있습니다.

#!/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

관련 정보