Use o AWK para dividir a substring pelos últimos n caracteres em uma nova coluna

2

Eu tenho um arquivo .csv grande no qual preciso dividir uma coluna específica por comprimento de string. Estou tentando pegar os últimos 6 caracteres da coluna 2 e movê-los para uma nova coluna.

Atual :

3102017,90131112,0,740
3022017,8903944,90,0
3092017,127037191,475,0

desejado :

3102017,90,131112,0,740
3022017,8,903944,90,0
3092017,127,037191,475,0
    
por Joseph Sortino 03.05.2017 / 15:23

5 respostas

5

Com um awk compatível com POSIX:

awk -F, -v OFS=, '{sub(/.{6}$/, OFS "&", $2); print}'

Com um sed compatível com POSIX:

sed 's/^\([^,]*,[^,]*\)\([^,]\{6\}\)/,/'

Eles modificam as linhas apenas se o segundo campo tiver pelo menos 6 caracteres (note que ele vai mudar felizmente o 111,123456,333 para 111,,123456,333 deixando o segundo campo vazio).

    
por 03.05.2017 / 15:52
3

abordagem do KISS, com awk :

$ awk -F, '{l=length($2); if (l>6) {$2=substr($2,1,l-6) OFS substr($2,l-5)}} 1' OFS=, file
3102017,90,131112,0,740
3022017,8,903944,90,0
3092017,127,037191,475,0
    
por 03.05.2017 / 15:35
2

Com uma implementação sed com suporte para expressões regulares estendidas, assume pelo menos 6 caracteres na segunda coluna para todas as linhas

$ sed -E 's/,([^,]*)([^,]{6}),/,,,/' ip.csv 
3102017,90,131112,0,740
3022017,8,903944,90,0
3092017,127,037191,475,0
  • -E para expressões regulares estendidas, algumas implementações precisam de -r
  • ,([^,]*)([^,]{6}), corresponderá à , segunda coluna e ,
    • A segunda coluna é capturada em dois grupos com os últimos 6 caracteres no segundo grupo
  • ,,, substitua conforme desejado
por 03.05.2017 / 15:39
2

Com perl , uma vez que sed e awk já foram obtidos:

perl -F, -lpe 'splice @F, 1, 1, ($F[1] =~ m/^(\d+)(\d{6})$/g); $_ = join ",", @F' file

Com vim , apenas por diversão:

:%s/\m,\d*\zs\ze\d\{6},/,/
    
por 03.05.2017 / 16:19
1
perl -pe 's/(,.*?,)/$1 =~ s!......,!,$&!r /e'  x.csv
  • substitua o segundo campo ( ,.*?, ) pelo ...
  • resultado da substituição ( =~ s! ...!...!r ) dos últimos 6 dígitos ( ...... ) por eles e e ,
por 03.05.2017 / 19:00