Você parece ter deduzido corretamente o que {a[NR+2]} NR in a { ... }}
faz;
-
/^KeyPress/ {a[NR+2]}
cria um elemento (valor vazio) na matriza
com índiceNR+2
, quando o início da linhaNR
corresponde à sequênciaKeyPress
-
Por isso,
NR in a
é verdadeiro para a linha duas linhas abaixo, em que/^KeyPress/
correspondia
A esse respeito, talvez pudesse ter sido escrito de forma mais transparente como
awk -F'[ )]+' '/^KeyPress/ {n=NR+2} NR==n { printf "%-3s %s\n", $5, $8}'
Uma pergunta possivelmente mais complicada é por que os campos a serem impressos são $5
e $8
em vez de $4
e $7
; isso é porque o tratamento do espaço em branco inicial é diferente quando se usa um separador de campo não padrão: a partir do Divisão de Campos Padrão seção do manual GNU awk
:
Fields are normally separated by whitespace sequences (spaces, TABs, and newlines), not by single spaces. Two spaces in a row do not delimit an empty field. The default value of the field separator FS is a string containing a single space, " ". If awk interpreted this value in the usual way, each space character would separate fields, so two spaces in a row would make an empty field between them. The reason this does not happen is that a single space as the value of FS is a special case—it is taken to specify the default manner of delimiting fields.
If FS is any other single character, such as ",", then each occurrence of that character separates two fields. Two consecutive occurrences delimit an empty field. If the character occurs at the beginning or the end of the line, that too delimits an empty field. The space character is the only single character that does not follow these rules.