在 awk 中计算表达式

在 awk 中计算表达式

我想创建一个条件表达式字符串并传入一个 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"

然后去提高你的。希望这会有所帮助。

相关内容