awk
não é o shell. awk
tem sua própria gramática, sintaxe e semântica. ${1}
não está sintaticamente correto awk
code enquanto ambos $1
e $"1"
são (e são equivalentes em awk
). Em awk
, estas não são substituições.
Com awk
, $1
refere-se ao primeiro campo do registro de entrada atual e $0
refere-se ao registro de entrada completo, enquanto no shell, $1
refere-se ao primeiro parâmetro posicional (geralmente o primeiro argumento na linha de comando de um script ou função) e $0
geralmente se refere ao nome do shell atual ou shell script.
As variáveis do shell e as variáveis awk
também são completamente separadas. É por isso que awk
tem o sinalizador de linha de comando -v
para definir suas variáveis se você precisar "importar" um valor do shell para seu script awk
:
$ awk -v var="$var" '{...}'
Você também pode atribuir ao script awk
o valor de uma variável shell como esta:
$ awk '{...}' var="$var"
Isso é quase a mesma coisa que fazer com -v
, exceto que a variável var
estará vazia em qualquer bloco BEGIN
. Um bloco BEGIN
é executado antes olhando para os dados de entrada, e a variável é definida após a execução de tal bloco.
Você também pode fazer
$ awk '{...}' var="$value1" file1 var="$value2" file2
Isso faz com que a variável var
obtenha o valor da variável de shell $value1
pouco antes de o file1
estar sendo processado e, em seguida, o valor da variável de shell $value2
antes de file2
estar sendo processado. / p>
Se algum arquivo tiver o nome var="$value1"
no último exemplo (por exemplo, var="42"
, que é um nome de arquivo Unix perfeitamente legal), esse arquivo não ser processado. Além disso, se um padrão de globbing de nome de arquivo de shell na linha de comando pegar um arquivo cujo nome se parece com uma atribuição a uma variável, essa atribuição estará ativa no script awk
.