Eu despejei os dados da tabela do banco de dados em um arquivo simples e abaixo está a aparência dos dados: (Por favor, copie abaixo
;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)
deseja converter o formato acima como abaixo:
A linha deve conter o número seq (prefixado). É necessário remover os nomes das colunas e os espaços em branco presentes no arquivo original no início e no final.
ABAIXO ESTÁ O FORMATO DE DADOS QUE ESTOU OBTENDO USANDO O CÓDIGO SUGERIDO:
awk -F ';' '/^;-----------;/ {start=1;next;}; start==0 {next;}; {gsub(" +",""); print NR "" $0;}' temp_file > test
FORMAT após executar o script acima:
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)
Acima: o número da linha do prefixo não vem em sequência (incrementando usando as linhas anteriores que não são os dados reais). O arquivo inicial continha informações adicionais em um arquivo simples, como nome da coluna @ início, no final do arquivo alguns detalhes adicionais que eu queria, como contagem de registros, etc.
Quero os dados no formato abaixo (que deve ter um número de linha de prefixo e incluir apenas linhas de table , não os dados adicionais anteriores e 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.
Responder1
awk -F ' *; *' \
'{printf "%d;",NR; for(i=2;i<=NF;i++) printf "%s;",$i; print "";}' file
-F
define o separador de campo para o regex *; *
(ou seja, "ponto e vírgula com qualquer número (excluindo zero) de espaços em ambos os lados").
Ou, mais simples:
awk -F ' *; *' -v OFS=";" '{$1=NR; $(NF+1)=""; NF--; print}' file
$(NF+1)=""; NF--;
apenas impõe a recomputação, $0
mas agora com o OFS
separador de campo alterado.
Ainda mais simples:
awk -F ';' '{gsub(" +",""); print NR "" $0;}' file
If awk
também deve "processar" (ou seja, ignorar) as linhas principais:
awk -F ';' '/^;-----------;/ {start=1;next;};
start==0 {next;}; /^[^;]|^$/ { exit;}; { line_nr++; gsub(" +",""); print line_nr "" $0;}' file
editar
Não prestei atenção suficiente e esqueci de adaptar o número da linha no último exemplo. Como as linhas lidas não são mais iguais às linhas escritas, o NR (simples) não pode mais ser usado.
editar 2
A adição de /^[^;]|^$/ { exit;};
interrompe o processamento se ocorrer uma linha que não comece com ;
.
Responder2
Usando sed
eawk
sed -e '/^; *NULL/ s/ *//g' file | sed -n '/^;NULL.*/,$p' | awk '{print NR$0}'
sed -e '/^; *NULL/ s/ *//g' file
- Remove os espaços nas linhas que começam com; NLL
.sed -n '/^;NULL.*/,$p'
- Remove todas as linhas antes da linha que começa com; NULL
.awk '{print NR$0}'
- imprime todas as linhas precedidas do valor NR.
Responder3
Acho que até sed
e awk
pode ser um pouco exagerado aqui.
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
SAÍDA
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;