我在bash终端中使用它来获取大量文件中的平均值:
awk 'BEGIN{s=0;}{s=s+$2;}END{print s/NR;}' file
有效。出于好奇(即未来的知识),我想知道在shell中计算的常用方法。 R,bash,python ......?快速而肮脏但仍然坚固且快速。
答案 0 :(得分:2)
通常,您希望将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)
。
答案 1 :(得分: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 ))
答案 2 :(得分:1)
我认为你的问题不是处理文本文件,而是“一般来说,在shell中进行计算的最佳方法是什么?”。如果我错了,请告诉我,我会抹掉我的答案。
没有最好的方法,但一种简单而灵活的方法是使用bc,这是一个标准的shell命令。
命令bc支持任意精度算术:您必须使用关键字scale
指明所需的精度。例如:
echo "scale=10; 1/3" | bc
打印.3333333333
echo "scale=2; 1/3" | bc
打印.33
在脚本中,您可以这样使用
x=10
result=$(echo "scale=10; $x /5 "|bc)
echo $result
您可以在GNU页面上找到man bc
的更多信息:
http://www.gnu.org/software/bc/