Entendiendo el script AWK

Entendiendo el script AWK

formato de archivo plano:

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

El siguiente script se utiliza para formatear el archivo plano.

awk -F ';' '/^;-----------;/ {start=1;next;}; start==0 {next;}; /^[^;]|^$/ { exit;}; { line_nr++; gsub(" +",""); print line_nr "" $0;}' temp_file > test

A continuación se muestra el resultado correcto que obtengo al utilizar el script anterior.

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;

¿ALGUIEN PUEDE EXPLICARME EL SIGUIENTE SCRIPT AWK, que se utiliza para formatear el archivo?

awk -F ';' '/^;-----------;/ {start=1;next;}; start==0 {next;}; /^[^;]|^$/ { exit;}; { line_nr++; gsub(" +",""); print line_nr "" $0;}' temp_file > test

Pude entender algunas cosas del script anterior: 1) /^[^;]|^$/ { exit;}; detiene el procesamiento si aparece una línea que no comienza con ; 2) está ignorando las líneas principales

Respuesta1

Los scripts Awk son mucho más fáciles de entender si los formatea con una condición por línea:

'/^;-----------;/ {start=1;next;};

Al leer una línea que comienza con ";----------;", establezca el inicio de la variable en verdadero, luego vaya a la siguiente línea de entrada sin imprimir nada.

start==0 {next;};

Si el inicio es falso, vaya a la siguiente línea de entrada sin imprimir nada.

/^[^;]|^$/ { exit;};

;Si se lee una línea que comienza con un carácter distinto o está vacía, deje de procesar el archivo y salga (un equivalente más simple sería !/^;/{exit})

{ line_nr++; gsub(" +",""); print line_nr "" $0;}

Para todas las demás líneas, incremente un contador, elimine todos los espacios de la línea y luego imprima el contador y la línea actualizada.

Respuesta2

Parece que awk -F ';' '/^;-----------;/ {start=1;next;}; start==0 {next;}; /^[^;]|^$/ { exit;}; { line_nr++; gsub(" +",""); print line_nr "" $0;}' temp_file > testes una versión complicada de nl -w 1 -p -s';' temp_file > test(pistavía Google).

Respuesta3

El script omite todas las líneas (2. comando) hasta que llega a una línea que comienza con ;----------;(1. comando). Luego imprime las siguientes líneas, eliminando espacios superfluos (4. comando), hasta llegar a una línea vacía o una que no comienza con ;(3. comando)

En resumen: imprime el primer bloque delimitado por ;----------;y (línea vacía o que no comienza con ;).

información relacionada