计算每行的平均值并保存到数组中

时间:2012-11-01 14:10:54

标签: bash unix

我正在尝试创建程序来读取每一行并计算每一行的平均值并存储到数组中...例如,程序将读取第一行,添加所有数字并除以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行;做         V = $行         集 - $ 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 个答案:

答案 0 :(得分: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}。

答案 1 :(得分: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的长列表...此解决方案适用于每行的任意数量的整数,并且还打印出行标签(如果需要,可以轻松删除该功能)。 / p>

答案 2 :(得分:1)

供参考,以下是awk如何解决此问题

array=( $(awk '{sum=0; for (i=2;i<=25; i++) sum=sum+$i; printf "%.0f ",sum/24 }' daily.txt ) )

答案 3 :(得分: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