1

各行を読み取り、各行の平均を計算して配列に格納するプログラムを作成しようとしています...たとえば、プログラムは最初の行を読み取り、すべての数値を加算し、24で割って、格納される平均を計算しますAvg_list[1]。プログラムを実行しようとすると、次のエラーが発生します。なぜそれが機能しないのかわかりません...誰かが問題を特定できますか?

コード:Kshで

 c=0
 while read -r line ; do
     v=$line
     set -- $v    ((g=($2+$3+$4+$5+$6+$7+$8+$9+$10+$11+$12+$13+$14+$15+$16+$17+$18+$19+$20+$21+$22+$23+$24+$25+$26)/24))
      echo $g
      Avg_list[${c}]=$g
      ((c=c+1))
  done < daily.txt

daily.txt

CPU 55 54 54 54 54 54 54 54 54 54 54 54 54 54 54 55 54 54 55 56 57 54 57 54
CPEAK 56 56 57 55 58 56 56 56 57 55 60 56 55 56 55 56 58 55 57 56 63 56 72 57
RAM 97 97 97 97 97 96 96 96 96 96 96 93 91 89 86 84 90 90 95 97 97 97 97 97
RPEAK 97 97 97 97 97 97 96 96 96 96 96 96 92 90 91 81 94 89 97 97 97 97 97 97

エラーメモ:

while read -r line ; do
        v=$line
        set -- $v
        ((g=($2+$3+$4+$5+$6+$7+$8+$9+$10+$11+$12+$13+$14+$15+$16+$17+$18+$19+$20+$21+$22+$23+$24+$25+$26)/24))
        echo $g
        Avg_list[${c}]=$g
        ((c=c+1))
done < daily.txt
+ 0< daily.txt
+ read -r line
+ v=CPU 54 54 54 54 54 54 54 54 54 54 54 54 54 54 55 54 54 55 56 57 54 57 54 54
+ set -- CPU 54 54 54 54 54 54 54 54 54 54 54 54 54 54 55 54 54 55 56 57 54 57 54 54
+ (( g=(54+54+54+54+54+54+54+54+CPU0+CPU1+CPU2+CPU3+CPU4+CPU5+CPU6+CPU7+CPU8+CPU9+540+541+542+543+544+545+546)/24 ))
PerformanceAM.sh[21]: g=(54+54+54+54+54+54+54+54+CPU0+CPU1+CPU2+CPU3+CPU4+CPU5+CPU6+CPU7+CPU8+CPU9+540+541+542+543+544+545+546)/24: 0403-009 The specified number is not valid for this command.

編集

    while read -r line ; do
    v=$line
    set -- $v
    ((g=${2}+${3}+${4}+${5}+${6}+${7}+${8}+${9}+${10}+${11}+${12}+${13}+${14}+${15}+${16}+${17}+${18}+${19}+${20}+${21}+${22}+${23}+${24}+${25}+${26})/24))
    echo $g
    Avg_list[${c}]=$g
    ((c=c+1))
done < daily.txt

新しいエラー:

-r行を読んでいる間; do v = $ line set-$ v((g = $ {2} + $ {3} + $ {4} + $ {5} + $ {6} + $ {7} + $ {8} + $ {9} + $ {10} + $ {11} + $ {12} + $ {13} + $ {14} + $ {15} + $ {16} + $ {17} + $ {18} + $ {19} + $ {20} + $ {21} + $ {22} + $ {23} + $ {24} + $ {25} + $ {26})/ 24)PerformanceAM.sh [18]:0403 -057 21行目の構文エラー: `/24'は予期されていません。

あなたの提案をありがとう!使用済みのブラケットを試したところ、このエラーが発生しました...さらに混乱しています....数値がまったく収集されていないようです...

4

4 に答える 4

1
#!/bin/ksh

while read -r line ; do
    v=$line
    set -- $v
    ((g=(${2}+${3}+${4}+${5}+${6}+${7}+${8}+${9}+${10}+${11}+${12}+${13}+${14}+${15}+${16}+${17}+${18}+${19}+${20}+${21}+${22}+${23}+${24}+${25})/24))
    echo $g
    Avg_list[${c}]=$g
    ((c=c+1))
done < daily.txt

で1つ欠落(g=${2}ていて、引数は${26}ではなく${25}までしか進みません。

于 2012-11-01T14:45:23.520 に答える
1

これはそれを行う必要があります:

while read -r line; do sum=0 total=0 for x in $line; do # if x is numeric if echo "$x" | grep -E '^[0-9]*$' > /dev/null ; then ((sum=sum+x)) ((total=total+1)) else echo -n "$x " fi done if [ $total = 0 ]; then echo else echo $((sum/total)) fi done < daily.txt

これは、$ 1 $ 2の長いリストを作成しないという私の一般原則に従います...このソリューションは、1行あたり任意の数の整数に対して機能し、行ラベル(必要に応じて簡単に削除できる機能)も出力します。

于 2012-11-01T15:01:54.470 に答える
1

参考awkまでに、これを解決するために使用できる方法は次のとおりです

array=( $(awk '{sum=0; for (i=2;i<=25; i++) sum=sum+$i; printf "%.0f ",sum/24 }' daily.txt ) )
于 2012-11-01T15:03:57.517 に答える
1

数値のリストを考えると、計算に逆ポーランド記法を使用する方が少し整理されています。

c=0
while read line; do
     set -- $line
     shift
     script="3 k $* + + + + + + + + + + + + + + + + + + + + + + + 24 / p"
     Avg_list[c++]=$( dc -e "$script" )
done < daily.txt

それで

printf "%s\n" "${Avg_list[@]}"

を生成します

54.458
57.250
94.333
94.875
于 2012-11-01T15:58:04.250 に答える