Compreender os comandos do awk; split, rec e ORS

0

Eu tenho um pedaço de código, estou tentando quebrar e decifrar. Eu preciso de alguém que possa me acompanhar no que está acontecendo em cada etapa:

FNR==NR {
  if (split($1,a, "_") ==3)
  f1[$1]
next
}
NF{
if (split($1, a, "_") ==3 && $1 in f1)
  p=1
  rec=(!rec)?$0:rec ORS $0
next
}
p{
  print rec ORS
  p=0; rec=""
}
    
por user236443 28.06.2017 / 18:16

1 resposta

0

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=""
}
    
por 28.06.2017 / 18:27

Tags