我需要逐行对文件中的数字求和。
文件:
1.0
0.46
0.67
我想求和,然后除以 3。
我目前有:
while IFS= read -r var
do
x=$(($var + $x)) | bc -l
done < "file.txt"
echo "$x / 3"
我的错误:
-bash: 1.0 + 0: syntax error: invalid arithmetic operator (error token is ".0 + 0")
答案1
Bash/shell 算术无法处理浮点算术。您可以使用以下方法完成您的任务awk
:
awk '{sum= sum+$1} END {print sum/3}' file
这将读取您的文件并将每一行添加到sum
.完成读取文件后,将打印sum
除以 3。
答案2
只是为了好玩
$ paste -sd+ file | dc -e2k0 -f- -e+3/p
.71
这里我们使用的是dc
逆波兰语计算器:将我们想要写成的数字相加
1.0 0.46 + 0.67 +
然而,用零 ( ) 填充堆栈-e0
并使其更容易
0 1.0+0.46+0.67 +
因为总和的主体可以通过简单的生成paste command
:
$ paste -sd+ file
1.0+0.46+0.67
最后,我们需要总和的最终后缀+
和后缀除法,我们可以将其写在另一个-e
命令中(不要忘记打印最终结果)为-e+3/p
。
最后一个问题是,虽然dc
可以以任意精度工作,但除法默认精度为 0,因此将返回整数结果。我们可以使用压入堆栈然后弹出它2k
的命令来更改它,并使用结果来设置精度。2
把它们放在一起:
paste -sd+ file | dc -e2k0 -f- -e+3/p
答案3
尝试这个:
x=0
while IFS= read -r var; do
x="$(echo "$var + $x" | bc -l)"
done < "file.txt"
echo "$x / 3" | bc -l
x
没有定义。- 你需要一个
echo
forbc
才能工作(不是混合 bash 算术)。
答案4
为了对数字求和,numsum
从num-utils
包装中将一次性做到这一点:
x=$(numsum file.txt)
它很乐意处理十进制数字。
numprocess
对于随后从同一个包中进行的划分可以提供帮助:
numsum file.txt | numprocess /%3/
%
是numprocess
表示除法的方式,斜杠是其参数结构的一个奇怪之处。