Avaliar expressão dentro do awk

1

Eu quero criar uma string de expressão condicional e passar um script awk. Meu script é como abaixo ...

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

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

Mas a instrução "if (command)" sempre é avaliada como verdadeira, o que não é correto. Eu quero saber a maneira correta de executar esta declaração ..

Em execução ...

./test_awk.sh

Retorna

hye

Qual não é a resposta esperada.

O arquivo de teste tem seguinte (apenas uma amostra):

hello^Thye^Tbye

Muito obrigado antecipadamente

    
por Saikat Dasgupta 12.09.2014 / 08:18

2 respostas

1

Se a operação lógica é sempre a mesma (ou seja, neste caso == ) e você só quer mudar o número do campo e o valor contra o qual é testado, então você pode passá-los como variáveis separadas, por exemplo

#!/bin/bash

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

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

Se você realmente quer criar um script awk variável, então IMHO é necessária uma abordagem diferente, por exemplo, usando um documento aqui para escrever o script awk na hora usando o shell para expandir seu comando variável - algo como

#!/bin/bash

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

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

  if ( $3 == "hello" )
  {
      print "bye"
  }
}
EOF
    
por steeldriver 12.09.2014 / 12:34
0

Deixa o rastreio:

$ cat test
hello^Thye^Tbye

$ awk  '{ print ( == hello) ? "true" : "false" }' test
true # wrong output

$ awk  '{ print ( == "hello") ? "true" : "false" }' test
false # correct output

de acordo com o rastreio quando usamos == hello , obtemos resultados errados e, quando alterados para == "hello" , incluindo com aspas duplas ao redor da string , a saída está correta.

Então encontramos a declaração incorreta e o problema está no valor da variável comm se você definir:

$ comm="$3 == "hello""

e faça eco:

$ echo $comm

você verá que a variável comm tem valor abaixo

 == hello

para que você precise de aspas duplas em torno do valor , edite seu valor com este:

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

depois vá e melhore o seu. espero que isso ajude.

    
por sddgob 12.09.2014 / 12:34