formato de arquivo simples:
;metier_code ;
;-------------------------;
(0 rows affected)
;CRDS_Ptf_No; ; ; ; ; ; ; ; ; ; ; ; ; ; ;Status;
;-----------;----------;--------------------------------;-------------------------;----------;--------------------------------;-;-------------------------;-------------------------;---------------;---------------;---------------;-------------------------;-------------------------;-----;------;
; NULL;ABCD ;ABHJARS ; ;ABCD ;ABCD ;Y; ; ; ; ; ; ; ; ;A ;
; 1234;XEU-ANKD ;XEU-AJKD ; ;ABCD ;ABCD ;Y; ; ; ; ; ; ; ; ;A ;
.
.
; 11745;ANJLDMAOKD;AMKDJ AN DJ JAHF AS CPFVH ACCR ;NONE ;AN DJ JAHA;AN DJ JAHA ;Y;NO ANKIO GAP ;YES AMK SCF ; ; ; ; ; ; ;I ;
; 11744;AMKDIONSKH;AMKDJ AN DJ JAHF AS CPFVH MTM ;NONE ;AN DJ JAHA;AN DJ JAHA ;Y;NO ANKIO GAP ;YES AMK SCF ; ; ; ; ; ; ;I ;
(5436 rows affected)
(return status = 0)
Return parameters:
; ;
;-----------;
; 5436;
(1 row affected)
; ; ;
;-------;-----------;
;grepkey; 5436;
(1 row affected)
O script abaixo é usado para formatar o arquivo simples.
awk -F ';' '/^;-----------;/ {start=1;next;}; start==0 {next;}; /^[^;]|^$/ { exit;}; { line_nr++; gsub(" +",""); print line_nr "" $0;}' temp_file > test
Abaixo está a saída correta que estou obtendo usando o script acima.
1;NULL;ABCD;ABHJARS;;ABCD;ABCD;Y;;;;;;;;;A;
2;NULL;XEU-ANKD;XEU-AJKD;;ABCD;ABCD;Y;;;;;;;;;A;
3;NULL;SWAPOLEIL;SWAPOLEIL;;QWERDF;QWERDF;Y;;;;;;;;;A;
.
.
5436;11744;AMKDIONSKH;AMKDJ AN DJ JAHF AS CPFVH MTM;;QWERDF;QWERDF;Y;;;;;;;;;A;
ALGUÉM PODE ME EXPLICAR O SCRIPT AWK ABAIXO, que é usado para formatar o arquivo
awk -F ';' '/^;-----------;/ {start=1;next;}; start==0 {next;}; /^[^;]|^$/ { exit;}; { line_nr++; gsub(" +",""); print line_nr "" $0;}' temp_file > test
consegui entender algumas coisas do script acima: 1) /^[^;]|^$/ { exit;}; interrompe o processamento se ocorrer uma linha que não comece com ; 2) está ignorando as linhas principais
Responder1
Os scripts Awk são muito mais fáceis de entender se você os formatar com uma condição por linha:
'/^;-----------;/ {start=1;next;};
Ao ler uma linha começando com ";----------;", defina a variável start como true e vá para a próxima linha de entrada sem imprimir nada.
start==0 {next;};
Se start for falso, vá para a próxima linha de entrada sem imprimir nada.
/^[^;]|^$/ { exit;};
Se uma linha que começa com um caractere diferente ;
ou vazia for lida, pare de processar o arquivo e saia (um equivalente mais simples seria !/^;/{exit}
)
{ line_nr++; gsub(" +",""); print line_nr "" $0;}
Para todas as outras linhas, incremente um contador, exclua todos os espaços da linha e imprima o contador e a linha atualizada.
Responder2
Parece que awk -F ';' '/^;-----------;/ {start=1;next;}; start==0 {next;}; /^[^;]|^$/ { exit;}; { line_nr++; gsub(" +",""); print line_nr "" $0;}' temp_file > test
é uma versão complicada de nl -w 1 -p -s';' temp_file > test
(dicaatravés do Google).
Responder3
O script pula todas as linhas (2. comando) até chegar a uma linha que começa com ;----------;
(1. comando). Em seguida, ele imprime as seguintes linhas, removendo espaços estranhos (4. comando), até chegar a uma linha vazia ou que não comece com ;
(3. comando)
Resumindo: imprime o primeiro bloco delimitado por ;----------;
e (linha vazia ou linha que não começa com ;
).