我在 bash 终端中使用它来获取一个巨大文件中的平均值:
awk 'BEGIN{s=0;}{s=s+$2;}END{print s/NR;}' file
有效。只是出于好奇(即为了将来的知识),我想知道在 shell 中计算的常用方法。R、bash、python……?快速而肮脏,但仍然强大而快速。
一般来说,你想expr
用于简单的算术:
$ expr 3 + 4
7
$ expr 3 '*' 4
12
您还可以使用dc
或bc
:
$ 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)
。
您必须对其进行基准测试才能确定,但根据我的经验,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 ))
我认为您的问题不是关于处理文本文件,而是更多“一般来说,在 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/