【发布时间】:2014-10-08 00:08:36
【问题描述】:
上下文:我有一个输入文件,其中包含带有相关值的参数,后跟文字数学表达式,例如:
PARAMETERS DEFINITION
A = 5; B = 2; C=1.5; D=7.5
MATHEMATICAL EXPRESSIONS
A*B
C/D
...
我想将第二部分的字符串解释为数学表达式,以便在输出文件中获得表达式的结果:
...
MATHEMATICAL EXPRESSIONS
10
0.2
...
我已经做过的事情: 到目前为止,我使用 awk 将所有参数名称及其对应值存储在两个不同的数组中。然后我将每个参数替换为它的值,这样我现在就处于与this thread 的作者类似的情况。 但是,她/他得到的答案不在 awk 中,除了最后一个对她/他的情况非常具体的答案,对于我作为 awk 和 shell 脚本的初学者来说很难理解。
后来我尝试了什么:由于我不知道如何在 awk 中执行此操作,我的想法是将新字段值存储在变量中,然后在 awk 中使用 shell 命令像这样的脚本:
#!bin/awk -f
BEGIN{}
{
myExpression=$1
system("echo $myExpression | bc")
}
END{}
不幸的是,这不起作用,因为 echo 命令无法识别该变量。
我想要什么: 我更喜欢单独使用 awk 而不调用外部函数的解决方案,但是,如果它更简单,我不反对使用 shell 命令的解决方案。
编辑考虑到目前所有的 cmets,我会更精确,我的输入文件看起来更像这样:
PARAMETERS_DEFINITION
[param1] = 5
[param2] = 2
[param3] = 1.5
[param4] = 7.5
MATHEMATICAL_EXPRESSIONS
[param1]*[param2]
some text containing also numbers and formulas that I do not want to be affected.
e.g: 1.45*2.6 = x, de(x)/dx=e(x) ; blah,blah,blah
[param3]/[param4]
参数的名称足够复杂,因此文档中的字符串:"[param#]" 的任何匹配都对应于我想要更改其值的参数。
以下是我设法将参数及其值存储在数组中的方式如下:
{
if (match($2,/PARAMETERS_DEFINITION/) != 0) {paramSwitch = 1}
if (match($2,/MATHEMATICAL_EXPRESSIONS/) != 0) {paramSwitch = 0}
if (paramSwitch == 1)
{
parameterName[numOfParam] = $1 ;
parameterVal[numOfParam] = $3 ;
numOfParam += 1
}
}
【问题讨论】:
-
如何将参数名称存储在数组中?还有只有一行参数定义吗?
-
@Jidder :我将从您的第二个问题开始:不,实际上,每行有一个参数,更像这样:
A = 5 ...,等号周围有空格。我利用这一点将适当的字段存储在和 中的 for 循环递增 直到遇到 行。够清楚吗? -
能否在您的问题中举例说明一下?
-
“一些文本还包含我不想受到影响的数字和公式。”非常无益。发布真实输入
-
@Jidder:我编辑了帖子以包含您需要的内容