我正在尝试创建程序来读取每一行并计算每一行的平均值并存储到数组中...例如,程序将读取第一行,添加所有数字并除以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'不会。
感谢您的建议!当我尝试使用支架时,我得到了这个错误...我现在更加困惑......似乎它根本没有收集数字......
答案 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