Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将bash表达式传递给AWK以进行浮点运算_Linux_Bash_Shell_Unix_Awk - Fatal编程技术网

Linux 将bash表达式传递给AWK以进行浮点运算

Linux 将bash表达式传递给AWK以进行浮点运算,linux,bash,shell,unix,awk,Linux,Bash,Shell,Unix,Awk,我曾试图在bash中进行浮点运算,但由于不支持浮点运算,我试图使用AWK获得解决方案。以下是我面临的问题: 我认为这对我来说很好: 代码 echo - | awk '{printf("%04.4f \n", (-225.2*7+30*6)/17 + (19^2)/9) }' read inpt echo - | awk -v input=$inpt '{printf("%04.4f \n", input) }' 输出 -42.0301 但我的动机是“读取表达式”,并将值正确计算为4位小数,

我曾试图在bash中进行浮点运算,但由于不支持浮点运算,我试图使用AWK获得解决方案。以下是我面临的问题:

我认为这对我来说很好:

代码

echo - | awk '{printf("%04.4f \n", (-225.2*7+30*6)/17 + (19^2)/9) }'
read inpt 
echo - | awk -v input=$inpt '{printf("%04.4f \n", input) }'
输出

-42.0301

但我的动机是“读取表达式”,并将值正确计算为4位小数,因此尝试在下面的代码中输入相同的表达式(-225.2*7+30*6)/17+(19^2)/9)并给出不正确的值(我猜变量是作为字符串传递给awk的):

代码

echo - | awk '{printf("%04.4f \n", (-225.2*7+30*6)/17 + (19^2)/9) }'
read inpt 
echo - | awk -v input=$inpt '{printf("%04.4f \n", input) }'
输出

0.0000

注意:在这个示例表达式中,请忽略second+周围的空格,我可以使用sed或类似的方法删除它(在从bash传递变量时,我在awk中使用空格获得语法错误)

非常感谢您的帮助。提前谢谢


PS:在我的例子中,bash版本是“bash-4.2”。我想这是bash的版本,它阻止了我使用其他许多选项。

首先,我没有看到命令中有任何错误,它应该可以工作。请重试发布的确切命令,如果问题仍然存在,请提供确切的详细信息

但是,如果您只需要格式化输出,则可以直接使用
printf

$ read input
12.34
$ printf '%4.4f' $input
12.3400
编辑:

如果在执行某些计算后需要格式化输出,则也可以使用
bc
。(
awk
仍应工作)

可以像往常一样在表达式中使用变量

$ read inpt
1234
$ echo "scale=4; $inpt * 0.01" | bc
12.34

不能在awk开箱即用模式中计算变量中的数据。在这种情况下,您需要编写一个算术计算器或使用预先存在的计算器,如。修复缺少的括号并正确引用表达式后,可以:

$ echo "((-225.2*7+30*6)/17 + (19^2)/9)" | awk -f calc.awk
((-225.2*7+30*6)/17 + (19^2)/9) =        -42.0301

我推荐并投票支持詹姆斯·布朗的答案。但是如果您现在需要一些没有外部依赖的东西,您可以简单地将输入插入脚本中

awk "END { printf("%04.4f\n", $input) }" </dev/null

还要注意避免基本上无用的
echo
的构造。从
/dev/null
重定向输入并将您的代码放入
END
(或
BEGIN
)块是运行任意一段Awk脚本而不需要任何输入的标准技术。

这就是您要寻找的吗

 echo "25 50"| awk '{print $2,"/",$1}' | bc

实际上,我需要计算表达式,而不仅仅是打印一个浮点数,这在常规bash脚本中是行不通的。它在awk中工作,但无法将浮动表达式变量从bash传递到awk构造函数。好吧,我说我没有发现您尝试过的任何错误。然而,由于我也是bc的粉丝(就像在另一个答案中一样),我会做一些事情,比如遵循
echo”scale=4;(-225.2*7+30*6)/17+(19^2)/9“| bc
,或者使用
read
input
echo”scale=4;$inpt*12.34”| bc
,或者你可以简单地将它传输到
bc
,设置所需比例时。在已删除的另一个答案的评论中,OP提到他不能使用
bc
。Bash版本不会影响外部命令的可用性。访问
bc
可能只需
sudo apt install-y bc
或您的平台上的等效程序即可。