Deve ficar claro se você olhar para a foto maior, por assim dizer. Um programa awk é um loop em torno do texto do programa, que lê uma linha e executa o programa nessa linha. Se você ler uma linha dentro do programa, o loop circundante não conseguirá ver essa linha: ela já foi consumida.
Por exemplo, seu programa
{ getline tmp; print tmp; print $0 }
poderia ser escrito como
BEGIN {
while (getline $0) {
getline tmp; print tmp; print $0
}
}
O bloco BEGIN
é executado uma vez no início do programa, e aqui o programa não faz mais nada - claro que essa é uma maneira altamente não-idiomática de escrever código awk.
Aqui deve ficar claro que o que acontece é:
- Leia a linha 1 para
$0
com o primeiro getline
- Leia a linha 2 para
tmp
com o segundo getline
- Imprima
tmp
, em seguida, $0
, ou seja, imprima a linha 2 e, em seguida, a linha 1
- Repita com o próximo par de linhas: imprima a linha 4 e, em seguida, a linha 3, etc.
Com um número ímpar de linhas, a última linha passa por getline $0
, então getline tmp
falha, mas você não está verificando o status de retorno, o que apenas deixa tmp
inalterado e você acaba imprimindo o próximo para a última linha novamente.