0

我在 bash 终端中使用它来获取一个巨大文件中的平均值:

awk 'BEGIN{s=0;}{s=s+$2;}END{print s/NR;}' file

有效。只是出于好奇(即为了将来的知识),我想知道在 shell 中计算的常用方法。R、bash、python……?快速而肮脏,但仍然强大而快速。

4

3 回答 3

2

一般来说,你想expr用于简单的算术:

$ expr 3 + 4
7
$ expr 3 '*' 4
12

您还可以使用dcbc

$ dc -e '3 4 + p'
7

我也没有看到您的awk脚本方法有什么特别错误的地方。我不够强大,dc无法做到这一点,但您可能会使用它来进行计算:

$ export DC_COMMANDS="dc script to operate on numbers from file"
$ dc -e "$(cut -d' ' -f2 < file) ${DC_COMMANDS}"

这会将所有数字传递给dc,然后运行您的命令,这些命令可用于对数字执行求和和除法指令。

另请参阅dc(1)

于 2012-10-16T12:35:12.840 回答
2

您必须对其进行基准测试才能确定,但​​根据我的经验,awk(正如您所使用的那样)通常是这类事情的最佳选择。比原生 shell 更快,启动开销也比 perl 等更复杂的东西少。也就是说,我倾向于喜欢在纯 shell 中编码,因为它不会太慢,只是因为。

#!/bin/bash
exec <file
declare -i sum=0 count=0
while read a b c; do
  (( count++ ))
  sum+="${b}"
done
echo $(( sum / count ))

当然,仅在您寻找积分结果时才有效,但如果需要,您可以随时尝试获得额外的十进制数字:

echo $(( sum / count )).$(( ((sum * 100) / count) % 100 ))
于 2012-10-16T12:36:34.233 回答
1

我认为您的问题不是关于处理文本文件,而是更多“一般来说,在 shell 中进行计算的最佳方法是什么?”。如果我错了,请告诉我,我会删除我的答案。

没有最好的方法,但一个简单灵活的方法是使用 bc,这是一个标准的 shell 命令。命令 bc 支持任意精度算术:您必须使用关键字指明您需要的精度scale。例如:

echo "scale=10; 1/3" | bc

打印 .3333333333

echo "scale=2; 1/3" | bc

打印 0.33

在脚本中,您会以这种方式使用它

x=10
result=$(echo "scale=10; $x /5 "|bc)
echo $result

您可以man bc在 GNU 页面上找到更多信息: http ://www.gnu.org/software/bc/

于 2012-10-16T12:43:26.877 回答