我想要一个脚本使 awk 成为一个交互式数学计算器,以评估每一行中给出的数学表达式。
即,不是构造 awk 命令来计算如下表达式:
$ awk 'BEGIN{print 180/1149}'
0.156658
$ awk 'BEGIN{print (150+141)/1149}'
0.253264
我希望我的脚本将我的数学表达式作为输入并以交互方式进行计算。所以会话看起来像(输入和输出的替代):
180/1149
0.156658
(150+141)/1149
0.253264
1 + 2
3
2 * 3 - 5
1
但是我自己无法做到这一点:
$ awk '{print}'
180/1149
180/1149
^C
$ awk '{print $0}'
180/1149
180/1149
1 + 2
1 + 2
^C
如果 awk 没有简单的解决方案,还有什么,比如 perl?
awk
算术评估作为/语言评估的一部分完成perl
。perl
有一个eval
在运行时将任意字符串评估为 perl 代码,所以你可以这样做:但是
awk
没有(虽然在 GNU 的情况下awk
,它的调试器有,见下文),所以你需要运行awk
每一行输入,并在代码参数中传递该行的内容,例如使用 GNUxargs
:你也可以这样做:
运行一个
awk
来解释所有代码行,但awk
只会在到达输入末尾时才开始对其进行评估,因此不能以交互方式使用。不过,您可以重复使用过去评估的结果perl
。喜欢:7
然后它会打印14
。使用 gawk 的调试器
awk
有一个调试器模式,eval
你可以将 awk 代码传递给它来解释,所以你可以用类似的东西劫持它:交互式地,只需使用bc
非交互式,如果你想编写表达式的评估脚本:
要交错输入和输出,我们可以使用粘贴
用 perl 运行它!
...或者我们也可以使用 awk。考虑以下(二阶)awk 脚本
run-in-awk
chmod +x run-in-awk
在我们实际上要求 awk 运行 awk之后它还适用于标准输入键盘输入。
当我们可以将 sh 与 awk 一起使用时,为什么只使用 awk 或 perl?
这将读取一个表达式并将其保存到一个变量中。然后调用 awk print 并传递变量。这是一个在 control-c 上退出的无限循环。
这样一个奇怪的变量名是用来保护脚本不改变其他脚本的变量。