编写Bash脚本来计算平均值

时间:2014-03-30 04:20:50

标签: c++ linux bash shell zsh

我对Bash脚本编写起来相对较新,最后想到了一些可以很好地介绍它的东西。我有一系列排序程序,我试图计时。像大多数测试一样,获得大样本量是件好事,但要始终如一地做到这一点很难。我认为使用Bash脚本自动化这个过程是一个很好的方法,但我不会做太多的Bash。

排序程序是用C ++编写的,并输出它们对从文件读入的10000个整数值的数组进行排序所需的时间。我使用几种不同的方法对数组进行排序,包括冒泡排序,快速排序和并行化(Boost线程)快速排序。在执行结束时,时间输出到控制台并停止执行。我想在Bash脚本中做的是......

for 1 to 100:
    ./quicksortpar --this is the command to start the program
    take time reading from output, place in collection

--when that's done
for 1 to 100 in the collection:
    add each item in the collection to a running total

--when that's done
echo running total/ 100

我如何在Bash中完成此操作?有可能吗?

编辑:

这是我在Tony D的指导下提供的当前Zsh脚本:

enter image description here

2 个答案:

答案 0 :(得分:2)

您可以在bash中使用gnu 进行浮点运算。所以做类似下面的事情

#!/bin/bash
declare -a coll
for _ in  {1..100}; do
  coll+=("$(./quicksortpar)")
done

sum=0
for i in ${coll[@]}; do
  sum="$(echo "$sum + $i" | bc -l)"
done

echo "$sum / ${#coll[@]}" | bc -l        

注意,根据Jonathan Leffler's suggestion

,时间可以相加一次而不是循环
sum=$( { printf "%d+" "${coll[@]}"; echo 0; } | bc -l)

答案 1 :(得分:1)

(更新:在zsh中意外地解决了这个问题 - 没有在bash中工作)

TOTAL=0
for ((i=1; i<=100; i++))
do
    let TOTAL+=$(./quicksortpar)
done
let AVG=TOTAL/10
echo $AVG