如何用 BASH 减去从其他 2 个文件中提取的 2 个浮点数

3ks*_*stc 2 bash shell-script arithmetic floating-point

我试图找出我从两个文件中获取的两个数字之间的差异。我认为我的代码会有意义:

我试图通过两种不同的方法使其工作,但没有奏效。我得到的输出是零 (0)。

#method 1
difference_btwn_eng_hrs_MX3_122=$(($(sed -n '1p' engine_hours_new_MX3_122.txt)-$(sed -n '1p' engine_hours_old_MX3_122.txt)))
echo "$difference_btwn_eng_hrs_MX3_122"

#method 2
new=$(sed -n '1p' engine_hours_new_MX3_122.txt)
old=$(sed -n '1p' engine_hours_old_MX3_122.txt)
echo "$new $old" | awk '{print $new - $old}'
Run Code Online (Sandbox Code Playgroud)

最终我将使用差异来设置电子邮件更新的间隔。

文件里面的值分别是511.786(新)和509.768(旧),我从终端得到的错误如下:

line 40: 511.786-509.765: syntax error: invalid arithmetic operator (error token is ".786-509.765")
Run Code Online (Sandbox Code Playgroud)

jim*_*mij 10

第一个例子的问题是它bash只能对整数进行操作,而你的第二次尝试awk是不正确的。

我建议bc用于这项工作:

bc <<< "$new-$old"
Run Code Online (Sandbox Code Playgroud)

<<<在这里被称为字符串,它基本上是较短的形式echo "$new-$old" | bc

awk如果您愿意,您还可以修改您的命令:

echo "$new $old" | awk '{print $1-$2}'
Run Code Online (Sandbox Code Playgroud)

或(如上使用此处的字符串):

awk '{print $1-$2}' <<< "$new $old"
Run Code Online (Sandbox Code Playgroud)

  • @3kstc我知道你没有`bc`,但是使用`awk`的解决方案也不起作用?您可以使用*命令替换*`$()`将输出分配给变量:`difference=$(awk '{print $1-$2}' &lt;&lt;&lt; "$new $old")` (2认同)