我想创建一个条件表达式字符串并传入一个 awk 脚本。我的脚本如下...
comm="\$3 == "hello""
awk -F "^T" -v command="${comm}" '
{
if ( command )
{
print "hye"
}
if ( $3 == "hello" )
{
print "bye"
}
}' test
但是语句“if(command)”的计算结果始终为真,这是不正确的。我想知道执行此语句的正确方法。
跑步时...
./test_awk.sh
它返回
hye
这并不是预期的答案。
测试文件如下(仅为示例):
hello^Thye^Tbye
提前谢谢了
答案1
如果逻辑运算始终相同(即在本例中==
),而您只想更改字段编号和测试它的值,那么您可以将它们作为单独的变量传递,例如
#!/bin/bash
awk -v field=3 -v value="hello" '
{
if ( $field == value )
{
print "hye"
}
if ( $3 == "hello" )
{
print "bye"
}
}' test
如果你真的想创建一个变量 awk 脚本,那么恕我直言,需要采用不同的方法,例如使用这里的文件使用 shell 动态编写 awk 脚本来扩展命令变量 - 类似于
#!/bin/bash
mycommand="\$3 == \"hello\""
awk -f- test << EOF
{
if ( ${mycommand} )
{
print "hye"
}
if ( \$3 == "hello" )
{
print "bye"
}
}
EOF
答案2
让我们追踪:
$ cat test
hello^Thye^Tbye
$ awk '{ print ($3 == hello) ? "true" : "false" }' test
true # wrong output
$ awk '{ print ($3 == "hello") ? "true" : "false" }' test
false # correct output
根据跟踪,当我们使用时,$3 == hello
我们会得到错误的输出,而当更改为$3 == "hello"
包括时用双引号括住字符串输出是正确的。
因此我们发现了错误的语句,问题出在comm
变量值上,如果您设置:
$ comm="\$3 == "hello""
并采取回声:
$ echo $comm
您将看到 comm 变量中有以下值
$3 == hello
所以你需要使用双引号括住值然后使用以下方式编辑您的值:
$ comm="\$3 == \"hello\""
$ echo $comm
$3 == "hello"
然后去提高你的。希望这会有所帮助。