Como modificar / organizar dados em um arquivo com o Awk

4

Eu tenho um arquivo csv parecido com este

ADRESSE_1,ADRESSE_SUITE,CODE
1 boulevard Veyrier Montagnères,,33120
2, rue du Débarcadère,33120
6 bis avenue du Général de Gaulle,,44180
avenue du Parc Pereire,,93250

Em três linhas, resumo um arquivo que contém várias centenas de linhas.

Eu gostaria de limpar e editar esse arquivo para que pareça com isso

NUMERO,ADRESSE_1,ADRESSE_SUITE,CODE
1,boulevard Veyrier Montagnères,,33120
2,rue du Débarcadère,,33120
6 bis,avenue du Général de Gaulle,,44180
,avenue du Parc Pereire,,93250

As linhas variam de 16 a 17 colunas, já posso ajustar isso com esse script usando printf para formatar

BEGIN { 
    FS = "[,]"; 
    OFS = ","; 
}
    NF != 16  {printf("%s,%s,%s,%s,%s%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n"), $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17}

Alguém pode me guiar?

    
por antuan sehikyan 15.01.2017 / 20:16

2 respostas

2

Acabei de colocar a minha solução com sed , mesmo que seja pedida especialmente para o AWK, acho esta solução mais compacta e direta:

GNU Sed (testado no CentOS):

sed -n '1!p' addresses.csv | sed -r 's!^([0-9]*(\sbis|\ster)?),?(.*)$!,!g;s!(.*)([^,])(,[0-9]*)$!,!g'

OS-X / BSD Sed

sed -n '1!p' addresses.csv | sed -E 's!^([0-9]*( bis| ter)?),?(.*)$!,!g;s!(.*)([^,])(,[0-9]*)$!,!g'

O primeiro comando sed é pegar todas as linhas, exceto a primeira (cabeçalho).

Para o segundo sed , uso substituições:

^                : Starting text.
[0-9]*           : all numbers (0, 1, ... 99, 999, 99999999 and so on) 
( bis| ter)?     : optionally followed by " bis" or " ter" (notice the space before); group 2
,?           : optionally followed by a comma
(.*)$            : the rest of the string until the end ($) (group 3)

!,           : replaced by first group (number + extension) - comma - third group 

Observe que o segundo grupo é o parêntese para 'bis' e 'ter', e o primeiro grupo é esse ([0-9]*( bis| ter){0,1})

A segunda substituição é normalizar as vírgulas (se não terminar por ,,\d , adicionamos uma vírgula extra.

    
por 16.01.2017 / 21:23
2

@ o comentário do ruffp é no local. No entanto, modulo desse problema você poderia dizer:

awk -F, '!$2 { sub(/^([0-9]*)/, "&,"); sub(/,,/, ","); } 1'  addresses
    
por 16.01.2017 / 09:58