2012-11-01 99 views
1

我試圖創建程序來讀取每一行並計算每一行的平均值並存入數組...例如,程序將讀取第一行,將所有數字和除以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 

新錯誤:

while read -r line; 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)PerformanceAM.sh [18 ]:0403-057第21行的語法錯誤:不需要`/ 24'。

感謝您的建議!當我試圖用托架我得到這個錯誤......現在我更糊塗了....好像它不收集數字在所有...

+1

您期待什麼輸出?我修改了你的代碼,我得到了:'++++++++ 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0 + 1 + 2 + 3 + 4 + 5+ 6 55 + 54 + 54 + 54 + 54 + 54 + 54 + 54 + CPU0 + CPU1 + CPU2 + CPU3 + CPU4 + CPU5 + CPU6 + CPU7 + CPU8 + CPU9 + 550 + 551 + 552 + 553 + 554 + 555 + 556 56 + 56 + 57 + 55 + 58 + 56 + 56 + 56 + CPEAK0 + CPEAK1 + CPEAK2 + CPEAK3 + CPEAK4 + CPEAK5 + CPEAK6 + CPEAK7 + CPEAK8 + CPEAK9 + 560 + 561 + 562 + 563 + 564 + 565 + 566' – Skyte

+2

舊的ksh可能支持或不支持$ 10作爲「裸」變量名,嘗試編輯爲$ {10},$ {11},...祝您好運。 – shellter

+2

你似乎缺少一個'('''''之前''':'((g = $ {2} ...',這可能是問題 – doubleDown

回答

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

這應做到:

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一長串的我的一般原則...該解決方案適用於任何數量的每行一個整數,它還會打印出的線路標籤(如果你願意,這個功能很容易刪除)。

1

爲便於參考,這裏是如何awk可以用來解決這個

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