He volcado los datos de la tabla de la base de datos en un archivo plano y a continuación se muestra cómo se ven los datos: (Copiar desde abajo
;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)
Quiero convertir lo anterior al siguiente formato:
La fila debe contener el número de secuencia (prefijo). Es necesario eliminar los nombres de las columnas y los espacios en blanco presentes en el archivo original al principio y al final.
A CONTINUACIÓN SE MUESTRA EL FORMATO DE DATOS QUE OBTENGO AL UTILIZAR EL CÓDIGO SUGERIDO:
awk -F ';' '/^;-----------;/ {start=1;next;}; start==0 {next;}; {gsub(" +",""); print NR "" $0;}' temp_file > test
FORMATO después de ejecutar el script anterior:
7;NULL;ABCD;ABHJARS;;ABCD;ABCD;Y;;;;;;;;;A;
8;NULL;XEU-ANKD;XEU-AJKD;;ABCD;ABCD;Y;;;;;;;;;A;
.
.
5443;11744;AMKDIONSKH;AMKDJ AN DJ JAHF AS CPFVH MTM;;QWERDF;QWERDF;Y;;;;;;;;;A;
5444
5445(5436rowsaffected)
5446(returnstatus=0)
5447
5448Returnparameters:
5449
5450;;
5452;5436;
5453
5454
5455(1rowaffected)
5456;;;
5457;-------;-----------;
5458;grepkey;5436;
5459
5460(1rowaffected)
Arriba: el número de fila del prefijo no aparece en secuencia (incrementando utilizando las líneas anteriores que no son los datos reales). El archivo inicial contenía información adicional en un archivo plano como el nombre de la columna @ comienzo, al final del archivo algunos detalles adicionales que quería, como el recuento de registros, etc.
Quiero los datos en el siguiente formato (que tendrá un número de fila de prefijo e incluirá solo filas de la tabla, no los datos adicionales anteriores y superiores)
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;
5436 - is the number of rows present in the table from where i am fetching the data.
Respuesta1
awk -F ' *; *' \
'{printf "%d;",NR; for(i=2;i<=NF;i++) printf "%s;",$i; print "";}' file
-F
establece el separador de campo para la expresión regular *; *
(es decir, "punto y coma con cualquier número (excepto cero) de espacios en ambos lados").
O, más simple:
awk -F ' *; *' -v OFS=";" '{$1=NR; $(NF+1)=""; NF--; print}' file
$(NF+1)=""; NF--;
simplemente impone el recálculo de $0
pero ahora con el OFS
separador de campo cambiado.
Aún más simple:
awk -F ';' '{gsub(" +",""); print NR "" $0;}' file
Si awk
también "procesará" (es decir, ignorará) las líneas principales:
awk -F ';' '/^;-----------;/ {start=1;next;};
start==0 {next;}; /^[^;]|^$/ { exit;}; { line_nr++; gsub(" +",""); print line_nr "" $0;}' file
editar
No presté suficiente atención y olvidé adaptar el número de línea en el último ejemplo. Como las líneas leídas ya no son lo mismo que las líneas escritas (simples), NR ya no se puede utilizar.
editar 2
La adición de /^[^;]|^$/ { exit;};
detiene el procesamiento si aparece una línea que no comienza con ;
.
Respuesta2
Usando sed
yawk
sed -e '/^; *NULL/ s/ *//g' file | sed -n '/^;NULL.*/,$p' | awk '{print NR$0}'
sed -e '/^; *NULL/ s/ *//g' file
- Elimina los espacios en las líneas que comienzan con; NLL
.sed -n '/^;NULL.*/,$p'
- Elimina todas las líneas anteriores a la línea que comienza con; NULL
.awk '{print NR$0}'
- imprime todas las líneas precedidas por su valor NR.
Respuesta3
Creo que incluso sed
y awk
podría ser un poco exagerado aquí.
grep '^;.*NULL' <<\DATA | tr -d '[:blank:]' | grep -n .
;metier_code ;
;-------------------------;
(0 rows affected)
;CRDS_Ptf_No; ; ; ; ;
; ; ; ; ; ;
; ; ; ;Status;
;-----------;----------;--------------------------------;-------------------------;----------;--------------------------------;-;-------------------------;-------------------------;---------------;---------------;---------------;-------------------------;-------------------------;-----;------;
; NULL;ABCD ;ABCD ; ;ABCS ;ABCS
;Y; ; ; ; ;
; ; ; ;A ;
; NULL;PKG-ABCP ;UEX-SWAP ; ;ABCS ;ABCS
;Y; ; ; ; ;
; ; ; ;A ;
; NULL;SWAPOLEIL ;SWAPOLEIL ; ;QWERDF ;QWERDF
;Y; ; ; ; ;
; ; ; ;A ;
DATA
PRODUCCIÓN
1:;NULL;ABCD;ABCD;;ABCS;ABCS;Y;;;;;;;;;A;
2:;NULL;PKG-ABCP;UEX-SWAP;;ABCS;ABCS;Y;;;;;;;;;A;
3:;NULL;SWAPOLEIL;SWAPOLEIL;;QWERDF;QWERDF;Y;;;;;;;;;A;