NR
é o número total de registros processados (inclusive o que está sendo processado atualmente); FNR
é o número de registros processados no arquivo atual . Isso só acontecerá no primeiro arquivo.
FNR==NR {
if (split($1,a, "_") ==3)
f1[$1]
next
}
Da mesma forma, NF
é o número de campos no registro atual. Se for uma linha em branco, isso será zero, o que é "falsy" (em oposição a "truthy") e, portanto, esse bloco será executado apenas para linhas não em branco. Anote o código neste bloco onde o valor de p
está definido; isso será importante mais tarde. ORS
é o separador de registro de saída; é isso que separa cada registro à medida que é escrito. Por padrão, é uma nova linha. Aqui está condicionalmente usado como o valor para a variável rec
.
NF{
if (split($1, a, "_") ==3 && $1 in f1)
p=1
rec=(!rec)?$0:rec ORS $0
next
}
Este último bloco só será executado se o valor de p
for "verdadeiro".
p{
print rec ORS
p=0; rec=""
}