아래와 같이 csv 파일이 있습니다.
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
수백 줄이 담긴 파일을 세 줄로 요약했습니다.
이 파일을 정리한 다음 편집하여 다음과 같이 만들고 싶습니다.
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
행의 범위는 16~17개 열이며 printf를 사용하여 이 스크립트의 형식을 지정할 수 있었습니다.
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}
답변1
방금 내 솔루션을 함께 던졌고 sed
특별히 AWK가 필요함에도 불구하고 이 솔루션이 더 간단하고 간단하다는 것을 알았습니다.
GNU Sed(CentOS에서 테스트됨):
sed -n '1!p' addresses.csv | sed -r 's!^([0-9]*(\sbis|\ster)?),?(.*)$!\1,\3!g;s!(.*)([^,])(,[0-9]*)$!\1\2,\3!g'
OS-X/BSD 세션
sed -n '1!p' addresses.csv | sed -E 's!^([0-9]*( bis| ter)?),?(.*)$!\1,\3!g;s!(.*)([^,])(,[0-9]*)$!\1\2,\3!g'
첫 번째 sed 명령은 첫 번째 줄(헤더)을 제외한 모든 줄을 가져오는 것입니다.
두 번째로는 sed
교체를 사용합니다.
^ : 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)
!\1,\3 : replaced by first group (number + extension) - comma - third group
두 번째 그룹은 "bis"와 "ter"의 괄호이고 첫 번째 그룹은 다음과 같습니다.([0-9]*( bis| ter){0,1})
두 번째 교체는 쉼표를 정규화하는 것입니다(아직 완료되지 않은 경우 ,,\d
추가 쉼표를 추가합니다.
답변2
@ruffp님의 의견이 맞습니다. 그러나 이 문제를 모듈로 계산하면 다음과 같이 말할 수 있습니다.
awk -F, '!$2 { sub(/^([0-9]*)/, "&,"); sub(/,,/, ","); } 1' addresses