【问题标题】:How to calculate extra large numbers with bc in bash如何在 bash 中使用 bc 计算超大数
【发布时间】:2017-01-31 18:23:37
【问题描述】:

我有一个 1800 行的文件,看起来像这样

600.76
600.66
700.44
566.66
Ect..

我制作了一个 bash 脚本来计算平均值。

现在我首先创建了一个变量来计算总列行数,例如:

Lines="$(awk 'END{print NR}' file.txt)"

然后是该列总和的另一个变量,如下所示:

Sum="$(awk '{s+1=$1}END {print s}' file.txt)"

最后我找到了这样的平均值:

Echo "scale=2 ; $Sum / $Lines" | bc

启用调试后返回:

+echo 'scale=2 ; 1.72161e+06 / 1800'
(Standard_1): syntax error

我现在意识到 bc 不做科学记数法,但我该如何解决这个问题。

我可以通过将小数限制为 2 或 3 位来简写小数。

【问题讨论】:

  • 为什么不直接使用awk
  • awk '{sum+=$1}END{print sum/NR}' 怎么样?
  • @twallberg awk 在答案变得太大后返回科学记数法。原来的问题是什么
  • @theloosegoos 也许awk '{sum+=$1}END{printf "%f\n", sum/NR} 会提供更好的结果。 awk 有一个 printf 实现,它模仿了很多(但不是全部)C 版本的功能......
  • @theloosegoos 输入文件中的任何行都是科学计数法吗?

标签: bash math bc


【解决方案1】:

不需要使用 awk。简单的 oneliner 就可以完成这项工作。

echo "scale=2; ("$(paste -sd+ file.txt)")"/$(wc -l <file.txt)|bc 

【讨论】:

  • 这仍然会将 bc 发送到一个错误,它无法处理科学记数法,当答案超过某个值时,就会发生这种情况。
【解决方案2】:

使用bc -l 进行求和和最终除法:

sum=0
count=0
while read number; do
  number=$(printf "%f\n" $number) # get rid of scientific notation
  sum=$(echo "$sum" '+' "$number" | bc -l)
  count=$((count + 1))
done < input
avg=$(echo $sum / $count | bc -l)
echo $avg

【讨论】:

  • 这会导致我出现同样的错误,因为文件的总和太大了,它以科学计数法表示。
  • @theloosegoos 不,不会。 bc 不使用科学记数法。它是一个任意精度的计算器。
  • 问题的根源是我的文件的列被添加时。总和是如此之大,以科学计数法表示。因此,当我将列的总和传递给 bc 时,它会抛出错误,因为它不接受符号。
  • @theloosegoos,你能提供输入文件吗?
  • 它是所给帖子中的第一个示例。除了它只是 1800 行中的第一行
猜你喜欢
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 2015-01-07
  • 2021-03-27
  • 2016-03-31
  • 1970-01-01
相关资源
最近更新 更多