Analisando o awk modificando o campo e registrando os separadores

1

Eu tenho um arquivo que é o seguinte:

------------------------------------------------------------------------------------------------------------------------------------------------------------------
49515 23/6/2014 SL B                                              .OO                                  2500.00
          R ROY                             4561235
BEING THE T.E PAID
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
23495 26/7/2014  CL A                                     2300.00                                         .00
          S DAS                             2334167
BEING THE MONEY RECOVERED 
---------------------------------------------------------------------------------------------------------------------------------------------------------------------

Minha saída desejada é a seguinte:

49515 23/6/2014  SL B                      .00                2500.00       R ROY          4561235        BEING THE T.E PAID
23495  26/7/2014  CL A             2300.00                        .00       S DAS          2334167       BEING THE MONEY RECOVERED

Eu tentei o seguinte código no awk sem muito sucesso, a idéia é definir newline como separador de campo e a linha de hífens (--------) como o separador de registro:

BEGIN {
   FS="/n"
   RS="^-+$"}
{ print $1,$2,$3}
    
por user133748 10.12.2015 / 14:54

2 respostas

3

Isso deve funcionar para suas necessidades:

awk '/---/ {print buff; buff="";} /[^-]/{buff=buff" "$0}'  filename

Você também pode usar blocos if-else:

awk '{if($0 ~ /---/){print buff; buff=""} else {buff=buff" "$0}}' filename

Também sem usar um buffer:

awk '{if($0 !~ /---/){printf "%s ", $0} else print ""}' filename
    
por 10.12.2015 / 15:20
1

Você estava quase lá:

$ awk -F'\n' -vRS="-+\n" '($1){print $1,$2,$3; }' file
49515 23/6/2014 SL B                                              .OO                                  2500.00           R ROY                             4561235 BEING THE T.E PAID
23495 26/7/2014  CL A                                     2300.00                                         .00           S DAS                             2334167 BEING THE MONEY RECOVERED 

Ou, se você preferir o bloco BEGIN:

awk 'BEGIN{FS="\n"; RS="-+\n"}($1){print $1,$2,$3; }' file

O problema (supondo que /n fosse um erro de digitação) era que você estava usando ^ e $ na definição de RS . Não tenho certeza sobre os aspectos internos de como o RS regex é implementado, mas imagino que eles realmente se referem ao início e ao final do arquivo, não à linha. Como solução alternativa, defino RS para um trecho de - que termina em uma nova linha. No entanto, isso significa que ele será quebrado se você puder ter um ou mais - no final de uma linha. Não sei como combinar desde o início, pois \n-+\n falha na primeira linha.

Uma abordagem semelhante seria substituir ^-+$ por uma linha em branco e usar o modo de parágrafo do perl:

$ sed 's/--*/\n/' file | perl -F'\n' -00ane 'print "@F\n";' 
49515 23/6/2014 SL B                                              .OO                                  2500.00           R ROY                             4561235 BEING THE T.E PAID
23495 26/7/2014  CL A                                     2300.00                                         .00           S DAS                             2334167 BEING THE MONEY RECOVERED 
    
por 10.12.2015 / 15:56