variável externa em awk [duplicado]

Esta pergunta já tem respostas aqui :

Resposta

Uma variável shell é exatamente isso: uma shell variável . Se você deseja transformá-lo em uma variável awk , você precisa de uma sintaxe como:

awk -v x="$x" "$2 == x {print $1}" infile 

ou

awk "$2 == x {print $1}" x="$x" infile 

No entanto, esses sofrem de um problema: as sequências de escape são expandidas neles (e com GNU awk 4.2 ou superior, se $x começar com @/ e terminar em /, é tratado como um tipo de variável regexp ).

Portanto, por exemplo, se a variável do shell contém os dois caracteres barra invertida e n , a variável awk acabará contendo o caractere nova linha (e com gawk 4.2+, se contiver @/foo/, a variável awk irá conter foo e ser do tipo regexp).

Outra abordagem (mas que requer um POSIX awk ou nawk ( ao contrário do awk original como ainda encontrado em alguns Unices estranhos)) é usar variáveis de ambiente:

Outra abordagem (ainda com o awks mais recente) é usar a matriz ARGV no awk:

awk "BEGIN {x = ARGV[1]; delete ARGV[1]} $2 == x {print $1}" "$x" infile 

Comentários

  • Pelo que eu sei, ARGV é na verdade um recurso POSIX, ' s apenas definido de forma diferente em gawk.
  • @ChrisDown Sim, ambos ARGV e ENVIRON são POSIX, mas não no awk original, desculpe se eu não ' claro sobre isso. Qual é a diferença em gawk?
  • gawk inclui opções não reconhecidas em ARGV, enquanto POSIX awk não ' t.
  • @ChrisDown, acho que você ' refere-se ao caso em que awk é chamado com -f como em awk -f script.awk arg1 arg2... onde GNU awk não ' t precisa de um -- para marcar o fim das opções se arg1 começar com -, mas é não é uma opção válida nessa versão particular de awk. Mas isso ' não é relevante para este assunto, e eu definitivamente não confiaria nesse comportamento (incluiria -- mesmo assim).

Resposta

Você não pode “usar variáveis externas em awk diretamente, você deve importá-los como awk variáveis primeiro.

x=3 awk -v foo="$x" "$2=foo{print $1}" infile 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *