awk
lê os registros como eles vêm e não tem noção de quão longe do final esses registros estão se ainda não os leu (registros extras podem muito bem ser adicionados depois de ler e processar o registro atual). / p>
Ao contrário de sed
, ele não pode nem saber qual é o último registro ( sed
tem o endereço $
que ele realmente implementa lendo internamente um registro antecipadamente para saber qual é o último). / p>
Você pode, no entanto, fazer algum processamento no final da instrução END
especial, ou com o GNU awk
, depois de ter processado cada arquivo de entrada (na instrução ENDFILE
).
Assim, você pode salvar os dois últimos registros enquanto os processa e, em seguida, na instrução END
/ ENDFILE
, lembre-se do penúltimo de onde salvou.
Por exemplo:
awk '{prevlast = last; last = $0}
END {if (NR >= 2) print "penultimate:", prevlast}' < input
Ou:
gawk '{prevlast = last; last = $0}
ENDFILE {
if (FNR >= 2) print "penultimate for", FILENAME ":", prevlast
}' file1 file2
Ou generalizá-lo para o th do final:
awk -v n=2 '{saved[NR % n] = $0}
END {if (NR >= n) print saved[(NR + 1) % n]}' < input
gawk -v n=2 '{saved[FNR % n] = $0}
ENDFILE {if (FNR >= n) print saved[(FNR + 1) % n]}' file1 file2