我输入了这种格式的文件
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
任何解决方案都是如此?
答案 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)
根据我们上面的讨论,这是一个快速尝试。 我试着不要过多地改变你的剧本 这是一个摘要
-
#! /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