Linux 将bash表达式传递给AWK以进行浮点运算
我曾试图在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位小数,
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
inputecho”scale=4;$inpt*12.34”| bc
,或者你可以简单地将它传输到bc
,设置所需比例时。在已删除的另一个答案的评论中,OP提到他不能使用bc
。Bash版本不会影响外部命令的可用性。访问bc
可能只需sudo apt install-y bc
或您的平台上的等效程序即可。