如何使用 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

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

相关内容