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
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
ARGVé na verdade um recurso POSIX, ' s apenas definido de forma diferente emgawk.ARGVeENVIRONsão POSIX, mas não no awk original, desculpe se eu não ' claro sobre isso. Qual é a diferença emgawk?gawkinclui opções não reconhecidas emARGV, enquanto POSIXawknão ' t.-fcomo emawk -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 deawk. Mas isso ' não é relevante para este assunto, e eu definitivamente não confiaria nesse comportamento (incluiria--mesmo assim).