如何在 Bash 中对文件中的变量求和

如何在 Bash 中对文件中的变量求和

我需要逐行对文件中的数字求和。

文件:

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
  1. x没有定义。
  2. 你需要一个echoforbc才能工作(不是混合 bash 算术)。

答案4

为了对数字求和,numsumnum-utils包装中将一次性做到这一点:

x=$(numsum file.txt)

它很乐意处理十进制数字。

numprocess对于随后从同一个包中进行的划分可以提供帮助:

numsum file.txt | numprocess /%3/

%numprocess表示除法的方式,斜杠是其参数结构的一个奇怪之处。

相关内容