Awk를 사용하여 파일의 데이터를 수정/구성하는 방법

Awk를 사용하여 파일의 데이터를 수정/구성하는 방법

아래와 같이 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

관련 정보