bash脚本中的错误

时间:2011-04-01 22:51:20

标签: bash unix

我输入了这种格式的文件

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

但是我在这个stmt

中收到错误
$sum+=$value

任何解决方案都是如此?

4 个答案:

答案 0 :(得分:2)

使用此:

sum+=$value

否则你会说“0 + = $ value”

另外,你可以这样做:

grep real $f  | while read LINE value; do

这将避免使用sed / awk。

答案 1 :(得分:2)

bash不支持浮点运算。它只支持整数。如果你不关心如何得到结果,awk更适合这个:

awk '/real/ {sum += $2} END {print sum}' files*
/ real /说,“查找带有单词real的那些行”,然后{sum + = $ 2}表示将第二个字段添加到sum。默认情况下,sum之类的变量将以空或零开始,取决于上下文。最后,END模式说,“在处理完所有文件后,打印总和。”

答案 2 :(得分:2)

最好使用awk或一些编程语言进行文件处理以及浮动数学。 Bash不支持浮点数学。您的脚本的问题是,您为每个找到的“真实”行调用外部sed命令。这是一个性能损失。

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

答案 3 :(得分:0)

根据我们上面的讨论,这是一个快速尝试。 我试着不要过多地改变你的剧本 这是一个摘要

  • 将值转储到数组中(您使用的管道导致数学在子shell中发生,结果不会影响'main'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