Como usar o awk para corrigir e unificar um arquivo corrompido com várias colunas e linhas?

1

Eu tenho um arquivo de várias linhas formatado em CSV com 5 colunas (campos). Eu preciso unificar e corrigir a primeira coluna corrompida que tem muitos formatos diferentes do código que preciso unificar. O formato final completo do meu código para a primeira coluna deve ser 00AB [0-9] [0-9] [0-9] [0-9] [0-9] que [0- 9] poderia ser qualquer número como 00AB21345 . Os primeiros quatro dígitos i.e. 00AB devem estar sempre como estão. mas os 5 dígitos depois disso ( ie [0-9] [0-9] [0-9] [0-9] [0-9]) poderia ser qualquer número e se houvesse qualquer > 5 dígitos, os dígitos ausentes da extrema esquerda devem ser substituídos por 0.

Example  <111> --> <00AB00111> ; or <1111> --> <00AB01111>. 

Para ter um exemplo, digamos que eu tenha o seguinte arquivo:

111     xx  yy  zzz ddd
1111    xx  yy  zzz ddd
11111   xx  yy  zzz ddd
A111    xx  yy  zzz ddd
A1111   xx  yy  zzz ddd
A11111  xx  yy  zzz ddd
AB111   xx  yy  zzz ddd
AB1111  xx  yy  zzz ddd
AB11111 xx  yy  zzz ddd
0A111   xx  yy  zzz ddd
0A1111  xx  yy  zzz ddd
0A11111 xx  yy  zzz ddd
0AB111  xx  yy  zzz ddd
0AB1111 xx  yy  zzz ddd
0AB11111 xx yy  zzz ddd
00A111  xx  yy  zzz ddd
00A1111 xx  yy  zzz ddd
00A11111xx  yy  zzz ddd
00AB111 xx  yy  zzz ddd
00AB1111 xx yy  zzz ddd
0AB11111 xx yy  zzz ddd
00AB12344   xx  yy  zzz ddd
00AB34527   xx  yy  zzz ddd
00AB56278   xx  yy  zzz ddd
00AB98902   xx  yy  zzz ddd

Para cobrir todo o cenário possível, criei o seguinte script awk muito longo. O formato em negrito representa o cenário potencial que poderia ser encontrado no meu arquivo que precisava ser corrigido.
Meu pedido, dose alguém sabe algum script awk para resolver isso em muito menor script? Se sim, você explicaria para mim em detalhes para aprender:)

##111 Awk -F',' '{if($0~/[0-9][0-9][0-9]/){print "001AB00"suBstr($1,1,3)","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' SC3.csv > y1.csv

##1111
Awk -F',' '{if($0~/[0-9][0-9][0-9][0-9]/){print "001AB"suBstr($1,1,4)","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' y1.csv > y2.csv
##11111
Awk -F',' '{if($0~/[0-9][0-9][0-9][0-9][0-9]/){print "001AB" suBstr($1,1,5)","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' y2.csv > y3.csv
##A111
Awk -F',' '{if($0~/[A-Z][0-9][0-9][0-9]/){print "001"suBstr($1,1,1) "B00"suBstr($1,2,4)","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' y3.csv > y4.csv
##A1111
Awk -F',' '{if($0~/[A-Z][0-9][0-9][0-9][0-9]/){print "001"suBstr($1,1,1) "B0" suBstr($1,2,5)","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' y4.csv > y5.csv
##A11111
Awk -F',' '{if($0~/[A-Z][0-9][0-9][0-9[0-9][0-9]/){print "001"suBstr($1,1,1) "B" suBstr($1,2,6)","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' y5.csv > y6.csv
##AB111
Awk -F',' '{if($0~/[A-Z][A-Z][0-9][0-9][0-9]/){print "001"suBstr($1,1,2) "00" suBstr($1,3,5)","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' y6.csv > y7.csv
##AB1111
Awk -F',' '{if($0~/[A-Z][A-Z][0-9][0-9][0-9][0-9]/){print "001"suBstr($1,1,2)"0" suBstr($1,3,6)","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' y7.csv > y8.csv
##AB11111
Awk -F',' '{if($0~/[A-Z][A-Z][0-9][0-9][0-9][0-9][0-9]/){print "001"suBstr($1,1,7)","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' y8.csv > y9.csv
##1A111
Awk -F',' '{if($0~/[0-9][A-Z][0-9][0-9][0-9]/){print "00"suBstr($1,1,2) ",B00" suBstr($1,3,5) ","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' y9.csv > y10.csv
##1A1111  
Awk -F',' '{if($0~/[0-9][A-Z][0-9][0-9][0-9][0-9]/){print "00"suBstr($1,1,1) "B0" suBstr($1,3,6) ","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' y10.csv > y11.csv
##1A11111
Awk -F',' '{if($0~/[0-9][A-Z][0-9][0-9][0-9][0-9][0-9]/){print "00"suBstr($1,1,2) "B" suBstr($1,3,7) ","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' y11.csv > y12.csv
##1AB111
Awk -F',' '{if($0~/[0-9][A-Z][A-Z][0-9][0-9][0-9]/){print "00"suBstr($1,1,1) suBstr($1,1,3)"00" suBstr($1,4,6) ","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' y12.csv > y13.csv
##1AB1111
Awk -F',' '{if($0~/[0-9][A-Z][A-Z][0-9][0-9][0-9][0-9]/){print "00" suBstr($1,1,3) "0" suBstr($1,4,7) ","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' y13.csv > y14.csv
##1AB11111
Awk -F',' '{if($0~/[0-9][A-Z][A-Z][0-9][0-9][0-9][0-9][0-9]/){print "00" suBstr($1,1,8) ","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' y14.csv > y15.csv
##11A111
Awk -F',' '{if($0~/[0-9][0-9][A-Z][0-9][0-9][0-9]/){print "0" suBstr($1,1,3)"B00" suBstr($1,4,6) ","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' y15.csv > y16.csv
##11A1111
Awk -F',' '{if($0~/[0-9][0-9][A-Z][0-9][0-9][0-9]/){print "0" suBstr($1,1,3)"B0" suBstr($1,4,7) ","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' y16.csv > y17.csv
##11A11111
Awk -F',' '{if($0~/[0-9][0-9][A-Z][0-9] [0-9][0-9][0-9]/){print "0" suBstr($1,1,3)"B" suBstr($1,4,8) ","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' y17.csv > y18.csv
##11AB111
Awk -F',' '{if($0~/[0-9][0-9] [A-Z][[A-Z][0-9][0-9][0-9]/){print "0" suBstr($1,1,4)"00" suBstr($1,5,7) ","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' y18.csv > y19.csv
##11AB1111
Awk -F',' '{if($0~/[0-9][0-9] [A-Z][[A-Z][0-9][0-9][0-9][0-9]/){print "0" suBstr($1,1,4)"0" suBstr($1,5,8) ","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' y19.csv > y20.csv
##1AB11111
Awk -F',' '{if($0~/[0-9][0-9] [A-Z][[A-Z][0-9][0-9][0-9][0-9][0-9]/){print "0" suBstr($1,5,9) ","$2","$3","$4","$5;}else{print $1","$2","$3","$4","$5;}}' y20.csv > y21.csv' 
    
por Daniel 29.11.2016 / 23:23

1 resposta

2

Talvez:

awk 'sub("^0?0?A?B?","",$1) && $1=sprintf("00AB%05d",$1)'

Exclua os fragmentos principais 00AB do campo 1 e converta-os em 00AB seguido pelo restante do número preenchido com zeros até o tamanho 5.

A expressão é sempre verdadeira, portanto, a ação { print } implícita é acionada. O sub é sempre verdadeiro porque a expressão regular é anulável: um pouco sorrateiro! A substituição ocorre mesmo se ^0?0?A?B? corresponder à sequência vazia, porque essa é uma correspondência bem-sucedida.

    
por 30.11.2016 / 00:21