mudar o formato numérico

2

Eu tenho muitas linhas como abaixo:

123; XXXXXXXXXXXXXXX; ABCDE; YYYYYYYY; 08082010; 000000000000000; 03/08/10; 110000; ZZZZZZZZZZZZZZZZZ; 0002

Eu só quero mudar o formato numérico (15 dígitos) XXXXXXXXXXXXXXX para XXXXXXXXX; XXX; XXX

e

YYYYYYYYY (9 dígitos) para YYYYYY; YYY

com sed.

qualquer outro formato apenas deixe o padrão

racix
fonte

Respostas:

1

Supondo que "X" e "Y" representem dígitos e que sua linha de exemplo realmente tenha 9 dígitos "Y" (ele tem oito em sua pergunta, mas a divisão que você quer mostra 9), isso deve funcionar:

sed 's/;\([0-9]\{6\}\)\([0-9]\{3\}\);/;\1;\2;/;s/;\([0-9]\{9\}\)\([0-9]\{3\}\)\([0-9]\{3\}\);/;\1;\2;\3;/'

Você poderia usar variáveis ​​para torná-lo talvez um pouco mais legível:

dig3="[0-9]\{3\}"
dig6="[0-9]\{6\}"
dig9="[0-9]\{9\}"
sed "s/;\($dig6\)\($dig3\);/;\1;\2;/;s/;\($dig9\)\($dig3\)\($dig3\);/;\1;\2;\3;/"
Dennis Williamson
fonte
1

Quando você tem dados estruturados e delimitadores de campo, é mais fácil usar o awk. Nos seus dados, você tem ";" como delimitadores, então use-o.

awk -F";" '
{
  $2=substr($2,0,9)";"substr($2,9,3)";"substr($2,12,3)
  $4=substr($4,0,6)";"substr($4,7)
}{print}
' OFS=";" file

A instrução awk diz usar ";" como delimitadores, trabalhe nos campos 2 e 4 ($ 2, $ 4) para a saída desejada. Para alterar o formato, use substringing. Por fim, defina o separador do campo de saída de volta para ";".

isso é mais claro do que usar regex desordenado com sed.

user31894
fonte