我有一个如下所示的 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
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