Em awk
, você acessa o valor de uma variável referenciando-a:
$ awk 'BEGIN {var=1; print var}'
1
Existem variáveis especiais , que são chamadas de variáveis de campo, denotadas por um $
símbolo, seguido por um número ou uma expressão. Portanto, tanto $1
como $(0+1)
fornecem o valor do primeiro campo.
No seu exemplo, você criou uma matriz associativa lines
, cujas chaves são o número da linha, os valores são toda a linha. Para obter o valor da chave 2
, você deve usar lines[2]
. Com $lines[2]
, você se referiu ao enésimo campo, com enésimo é o valor retornado por lines[2]
.
Quando você processa a primeira linha, lines[2]
é não inicializado, então pode retornar 0 ou vazio ou o que quer que seja (o comportamento não é especificado por POSIX). Em qualquer caso, print
e print $0
são os mesmos, por isso você obteve 1 a
, que é $0
da primeira linha.
Da segunda linha, lines[2]
é atribuído pelo conteúdo da segunda linha, que é 2 b
, e no contexto numérico, 2 b
return 2 , você obteve o valor do segundo campo $2
da segunda linha e assim por diante.
Agora, como a expressão após $
não é garantida para retornar um resultado numérico conforme especificado por POSIX:
Field variables shall be designated by a '$' followed by a number or numerical expression. The effect of the field number expression evaluating to anything other than a non-negative integer is unspecified; uninitialized variables or string values need not be converted to numeric values in this context
Portanto, pode haver implementações que serão quebradas. Pelo menos a versão do próprio Brian Kernighan :
$ echo 1 2 | bawk '{print $b}'
bawk: illegal field $(), name "b"
input record number 1, file
source line number 1
Em qualquer caso, você pode forçar a expressão a ser avaliada no contexto numérico, adicionando 0
a ela:
$ echo 1 2 | awk '{print $(b+0)}'
1 2