Оцените Выражение в awk

Я хочу создать строку условного выражения и передать в awk сценарии. Мой сценарий как ниже...

comm="\$3 == "hello""
awk -F "^T" -v command="${comm}" '
{
  if ( command )
  {
    print "hye"
  }

  if ( $3 == "hello" )
  {
      print "bye"
  }
}' test

Но оператор, "если (команда)" всегда оценивает к истинному, который не корректен. Я хочу знать корректный способ выполнить этот оператор..

На выполнении...

./test_awk.sh

Это возвращается

hye

Который не является ожидаемым ответом.

Тестовый файл имеет следующее (просто образец):

hello^Thye^Tbye

Заранее большое спасибо

1
задан 12 September 2014 в 15:50

2 ответа

Если логическая операция всегда является тем же (т.е. в этом случае ==), и Вы просто хотите изменить полевое число и значение, против которого это тестируется, то можно передать их как отдельные переменные, например,

#!/bin/bash

awk -v field=3 -v value="hello" '
{
  if ( $field == value )
  {
    print "hye"
  }

  if ( $3 == "hello" )
  {
      print "bye"
  }
}' test

, Если Вы действительно хотите создать переменную awk сценарий, то, по моему скромному мнению, другой подход требуется, например, с помощью здесь документ для записи awk сценария на лету с помощью оболочки для расширения переменной команды - что-то как

#!/bin/bash

mycommand="\$3 == \"hello\""

awk -f- test << EOF 
{
  if ( ${mycommand} )
  {
    print "hye"
  }

  if ( \$3 == "hello" )
  {
      print "bye"
  }
}
EOF
2
ответ дан 11 November 2019 в 09:32

Позволяет трассировке:

$ 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

Вы будете видеть, что переменная коммуникации имеет ниже значения в ней

$3 == hello

таким образом, Вам нужна двойная кавычка вокруг значения, затем редактируют Ваше значение с этим:

$ comm="\$3 == \"hello\""
$ echo $comm
$3 == "hello"

затем пойдите и улучшите Ваш.надеюсь, это поможет.

0
ответ дан 11 November 2019 в 09:32

Другие вопросы по тегам:

Похожие вопросы: