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