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
.ARGV
eENVIRON
são POSIX, mas não no awk original, desculpe se eu não ' claro sobre isso. Qual é a diferença emgawk
?gawk
inclui opções não reconhecidas emARGV
, enquanto POSIXawk
não ' t.-f
como 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).