AWK | Conversão dinâmica de linha para coluna

2

Meus arquivos:

EventTime=20180726001317
ObjectOfReference=TCU_XXX202
SPtext=Heartbeat Failure
EAName=TCU_XXX202
EventTime=20180726001317
ObjectOfReference=TCU_XXX203
SPtext=Heartbeat Failure
EAName=TCU_XXX203

Resultado esperado:

EventTime;ObjectOfReference;SPtext;EAName
20180726001317;TCU_XXX202;Heartbeat Failure;TCU_XXX202
20180726001317;TCU_XXX203;Heartbeat Failure;TCU_XXX203

Eu tentei com o script awk, mas não está funcionando:

awk -F\"= :\" '!/%a/&&/-EventTime|EAName|-ObjectOfReference|-SPtext|%A/{if(\ != \"%A\")printf \$NF\",\";else print \"\n\"}'
    
por ejejejej 26.07.2018 / 07:11

1 resposta

3

Com o GNU awk :

awk -F= '{a=(FNR!=NR)+1;printf "%s"(NR%4==0?RS:";"),$a} a==1&&NR>=4{nextfile}' file file

No entanto, se você não precisar da linha de cabeçalho, isso também fará o trabalho (e também trabalhará com mawk ):

awk -F= '{printf "%s"(NR%4==0?RS:";"),$2}' file

Explicação:

  • -F= define o separador de campo como = .
  • a=(FNR!=NR)+1 : $a está definido como 1 no primeiro arquivo e 2 no segundo.
  • printf "%s"(NR%4==0?RS:";"),$a : imprime a string e se for uma quarta linha imprima o separador de linha RS , senão imprima o separador de campo ;
  • a==1&&NR>=4 : se estivermos no primeiro arquivo e 4 linhas forem processadas ...
  • nextfile ... começa a processar o próximo arquivo (isso é específico do GNU)

Saída:

EventTime;ObjectOfReference;SPtext;EAName
20180726001317;TCU_XXX202;Heartbeat Failure;TCU_XXX202
20180726001317;TCU_XXX203;Heartbeat Failure;TCU_XXX203
    
por 26.07.2018 / 08:08