Compreendendo o script AWK

Compreendendo o script AWK

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 ;).

informação relacionada