尝试使用两个文件的内容获得平均值

时间:2017-04-02 21:12:42

标签: bash unix scripting

所以我的目录中有两个文件,每个文件都包含一个数字。我想制作一个计算这两个数字平均值的脚本。我该怎么写呢?这是正确的吗?

avg=$((${<file1.txt}-${<file2.txt})/2)

2 个答案:

答案 0 :(得分:1)

您的示例不起作用。此外,您的公式可能不正确。以下是两个没有必要cat的选项:

avg=$(( (`<file1.txt` + `<file2.txt`) / 2 ))

avg=$(( ($(<file1.txt) + $(<file2.txt)) / 2 ))

我发现第一个更具可读性。还要注意:当您的文件包含的不仅仅是普通数字时,这种简单的方法会导致问题。

编辑:

我应该注意到,不再推荐使用反引号(``)的第一个语法/遗留选项,应该避免使用。您可以在此处详细了解WHY。感谢 mklement0 获取链接!

EDIT2:

根据Eric的说法,这些值是浮点数。你不能直接在bash中这样做,因为只支持整数。你必须使用一个小帮手:

avg=$(bc <<< "( $(<file1.txt) + $(<file2.txt) ) / 2")

或者更容易理解

avg=$(echo "( $(<file1.txt) + $(<file2.txt) ) / 2" | bc)

对于那些可能想知道bc是什么的人(请参阅man bc):

  

bc是一种支持任意精度数的语言   交互式执行报表。

这是另一种选择,因为默认情况下通常会安装perl

avg=$(perl -e 'print( ($ARGV[0] + $ARGV[1]) / 2 )' -- $(<file1.txt) $(<file2.txt))

答案 1 :(得分:0)

您想要使用command substitution

avg=$(($(cat file1.txt)-$(cat file2.txt)/2))

然而,Bash是一门非常糟糕的数学语言(至少除非它是完全整数的数学)。您可能希望查看bc或&#34;真实&#34;像Python这样的语言。