작업은 숫자를 입력하는 경우입니다.
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