アクションは数字を入力する場合です。
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