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

Bash 计算每行的平均值并保存到数组中,bash,unix,Bash,Unix,我试图创建一个程序来读取每一行,计算每一行的平均值并存储到数组中……例如,程序将读取第一行,将所有数字相加,然后除以24来计算平均值,该平均值将存储到Avg_列表中[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+$

我试图创建一个程序来读取每一行,计算每一行的平均值并存储到数组中……例如,程序将读取第一行,将所有数字相加,然后除以24来计算平均值,该平均值将存储到Avg_列表中[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
错误说明:

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.
编辑

新错误:

而read-r行;做 v=$line 套装-$v 5.5}{{{{00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 057第21行出现语法错误:`/24'不应出现

谢谢你的建议!当我尝试使用括号时,我得到了这个错误…我现在更困惑了…它似乎根本不收集数字

#!/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}之前

您在g=${2}处缺少一个参数,参数只在${25}之前,而不是在${26}之前。这应该可以做到:

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美元的长清单。。。此解决方案适用于每行任意数量的整数,并且它还打印出行标签,如果需要,此功能很容易删除。

这应该可以做到:

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美元的长清单。。。此解决方案适用于每行任意数量的整数,并且它还打印出行标签,如果您需要,此功能很容易删除。

出于参考目的,下面介绍如何使用awk解决此问题

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

为了便于参考,这里介绍了如何使用awk来解决这个问题

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

给出一个数字列表,使用反向波兰符号进行计算会更整洁一些:

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

54.458
57.250
94.333
94.875

给出一个数字列表,使用反向波兰符号进行计算会更整洁一些:

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

54.458
57.250
94.333
94.875

你期望什么样的产出?我稍微修改了你的代码,我得到的是:我对你的代码稍微修改了一点,我对你的代码做了一点修改,我得到的是:我对你的代码做了一点修改,我对你的代码做了一点修改,我得到的是:我对你的代码做了一点轻微修改,我得到了:++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++2+563+564+565+566旧ksh可能支持也可能不支持$10作为裸变量名,尝试编辑为${10},${11}。。。祝你好运。你似乎在$:g=${2}…之前缺少了一个,这可能是problem@Skyte好的,所以Avg_list[1]=54,因为55 54 54 54 54 55 54 55 56 57 54 54的平均值是54。4@doubleDown面团好了,现在可以了,呵呵,我没有意识到还有额外的括号…谢谢你的帮助!:你期望什么样的产出?我稍微修改了你的代码,我得到的是:我对你的代码稍微修改了一点,我对你的代码做了一点修改,我得到的是:我对你的代码做了一点修改,我对你的代码做了一点修改,我得到的是:我对你的代码做了一点轻微修改,我得到了:++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++2+563+564+565+566旧ksh可能支持也可能不支持$10作为裸变量名,尝试编辑为${10},${11}。。。祝你好运。你似乎在$:g=${2}…之前缺少了一个,这可能是problem@Skyte好的,所以Avg_list[1]=54,因为55 54 54 54 54 55 54 55 56 57 54 54的平均值是54。4@doubleDown面团好了,现在可以了,呵呵,我没有意识到还有额外的括号…谢谢你的帮助!: