2011-04-01 181 views
0

我有這種格式錯誤bash腳本

real 0.00 
user 0.00 
sys 0.00 
real 0.00 
user 0.00 
sys 0.00 
real 0.00 
user 0.00 
sys 0.00 

我正在寫一個bash腳本,以獲得「真實」值的平均值的輸入文件。這劇本我寫

#! /bin/sh 

# FILES=/home/myfiles 

for f in $FILES 
do 
     echo " Processing $f file.." 
     sum=0; 
     grep real $f | while read LINE; do 
       value=$(sed "s/[^0-9]//g") 
       #value=`awk "^[0-9]"` 
       echo $value 
       $sum+=$value 
     done 
     #average=$sum/10; 
     #echo $average 
done 

但我在這個語句得到一個錯誤

$sum+=$value 

任何解決方案PLZ?

+0

確定,時間總是顯示兩位小數? – 2011-04-01 23:20:45

回答

2

使用此:

sum+=$value 

否則,你會說 「0 + = $值」

此外,你可以這樣做:

grep real $f | while read LINE value; do 

這將避免需要到sed/awk。

+0

謝謝,我試過這wrking,但總和的價值被附加像一個字符串,而不是像一個整數總和:0.000.000.000.000.000.000.00 – jessi 2011-04-01 23:16:54

+0

@Erik,最後,仍然需要awk或bc做十進制計算。最後,最好使用awk來做平均值。 – kurumi 2011-04-01 23:26:25

+1

bash會正常工作,你只需要去掉小數點(並把它加回你的結果中)......一旦你正在處理整數 - 嘗試用'let sum + = value'或'(( sum + = value))' – nhed 2011-04-02 00:41:10

2

bash不支持浮點運算。它只支持整數。如果你不關心如何得到的結果,AWK是更好的裝備此:

awk '/real/ {sum += $2} END {print sum}' files* 

的/真正/說,「找字真正的線」,然後{和+ = $ 2}意味着添加第二個字段進行求和。默認情況下,像sum這樣的變量將以空或零開始,取決於上下文。最後,END模式說:「處理所有文件後,打印總和。」

2

它更好地使用awk或一些編程語言,它將文件處理以及浮點運算一體化。 Bash不支持浮點數學。您的腳本存在的問題是,您會爲每個找到的「真實」線路調用外部sed命令。這是一個性能問題。

awk '/real/{s+=$2;c++}END{print "average is: " s/c}' file 
0

這是根據我們上面的討論進行的快速嘗試。 我試圖不改變你的腳本太多 這裏是一個總結

  • 值轉儲到一個數組(你必須使數學在一個子shell中發生的管道,結果不會使之達到了「主''殼
  • 在sed表達式中添加了更多的處理去除前導零(但要確保至少有一個數字)
  • 我沒有跟蹤爲什麼計算平均值除以10,所以我使用實際計數物品在
  • 最後,假設你想要在同一個單位的平均測量單位輸入 - 我用printf的打印由100

劃分的結果 -

#! /bin/sh 

# FILES=/home/myfiles 
FILES=a 
for f in $FILES 
do 
     echo " Processing $f file.." 
     values=($(grep real ${f} | sed -e "s/[^0-9]//g" -e "s/^0*//" -e "s/^$/0/")) 
     sum=0; 
     for value in ${values[@]}; do 
      echo $value 
      ((sum+=value)) 
     done 
     average=$((sum/${#values[@]})); 
     printf "AVG: %d.%02d\n" $((average/100)) $((average%100)) 
done 
+0

這個作品很棒,thnx很多@nhed - jessie – jessi 2011-04-02 19:48:35

+0

@jessi歡迎您!(請記住接受答案,使用左邊數字下的複選標記) – nhed 2011-04-02 20:28:08