【问题标题】:Writing a Bash script to calculate averages编写 Bash 脚本来计算平均值
【发布时间】:2014-03-30 04:20:49
【问题描述】:

我对 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 脚本:

【问题讨论】:

  • 请注意,Bash 不进行浮点运算。您将需要使用其他一些工具:awkbcperlpython,或者……来进行算术运算。我建议简单地将排序程序的原始输出记录到一个文件中(这样你就有一个永久的记录——至少在你删除文件之前),然后你可以分析并重新分析你的内心内容。并用于比较您一周前使用的内容和今天使用的内容等。确保输出包括哪种排序算法、数据集是如何生成/塑造的,以及数据集有多大。

标签: c++ linux bash shell zsh


【解决方案1】:

您可以在 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)

【讨论】:

  • 不确定是否真的需要第二个 for 循环,但保留它以匹配您的描述。
  • 这似乎在第 8 行产生了语法错误。例如./qsp_average.sh: line 8: ((: sum+=0.001485: syntax error: invalid arithmetic operator (error token is ".001485")
  • @AaronMcRuer Woops,没有意识到时间也会有浮点数。查看更新。
  • 您可以使用sum=$(printf "%d+" "${coll[@]}"; echo 0; } | bc -l)提高求和的性能;这只会调用一次 bc 而不是 100 次。
  • @JonathanLeffler 谢谢。在很多情况下非常有用的建议,在回答中添加了注释。
【解决方案2】:

(更新:在 zsh 中意外解决了这个问题 - 在 bash 中不起作用)

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

【讨论】:

  • 当我运行这个时,我得到./qsp_average.sh: line 9:,一堆时间读数,然后是syntax error: invalid arithmetic operatorlet AVG=TOTAL/10 里的东西。对于它的价值,被吐出的值通常是小数点后六个数量级的小数。
  • @AaronMcRuer 对不起-我的错误-我偶然在(我的正常)zsh中解决了这个问题。让我看看……
  • 看来你不能在 Bash 中做浮点数学运算(我刚刚发现),所以我会试试你的 zsh 解决方案。
  • @AaronMcRuer 哦,好吧 - 我开始看 bash,但后来我的另一半就来聊天了。如果它对你来说都是一样的,猜猜 zsh 会很好(它处理浮点数)。
  • @AaronMcRuer 你确定你在 zsh 中执行脚本吗?您可以将#!/bin/zsh 放在顶部,或者确保您从交互式 zsh 会话 ala "source myscript" 或 ".myscript"(但不是 ./myscript)中 source 它。
猜你喜欢
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多