Bash 计算每行的平均值并保存到数组中
我试图创建一个程序来读取每一行,计算每一行的平均值并存储到数组中……例如,程序将读取第一行,将所有数字相加,然后除以24来计算平均值,该平均值将存储到Avg_列表中[1]。 当我尝试运行程序时,我遇到以下错误,我不知道为什么它不工作。。。有人能找出问题吗 代码:以Ksh为单位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+$
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面团好了,现在可以了,呵呵,我没有意识到还有额外的括号…谢谢你的帮助!: