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