1

我正在尝试创建程序来读取每一行并计算每一行的平均值并存储到数组中......例如,程序将读取第一行,将所有数字相加并除以 24 以计算将存储到的平均值平均列表[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

每日.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 行;做 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)性能AM.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

你错过了一个(g=${2}参数只到 ${25} 而不是 ${26}。

于 2012-11-01T14:45:23.520 回答
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 回答
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 列表……这个解决方案适用于每行任意数量的整数,它还打印出行标签(如果你愿意,这个功能很容易删除)。

于 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 回答