我有如下格式的 csv 文件。
1,123-456,IND,91,UAE,97,USA,01,SA,27
3,345-678,AUS,61,SLA,94,NZW,64,RS,7
它应该基于,(\w{3}),(\d{2}),
模式检查进行检查,以及它应该在分隔中显示多少次匹配|
,如下所述,使用 AWK 命令如何实现。
预期产出
1,123-456,IND,91|UAE,97|USA,01
3,345-678,AUS,61|SLA,94|NZW,64
答案1
当你说 时\w+
,我假设你实际上的意思是[a-zA-Z]
因为\w
也匹配数字和下划线,看起来你只想要字母。事实上,根据您的示例,您可能只需要大写字母。最后,我再次猜测,因为您没有解释,看起来您想排除字母字符串长度不完全是 3 个字符的情况。如果是这样,这里有一种在 Perl 中做你想做的事情的方法:
$ perl -lne '/^(.*?),[A-Z]{3},\d{2},/; $start=$1; @k=(/,(\w{3},\d{2})/g); print "$start,", join("|",@k)' file
1,123-456,IND,91|UAE,97|USA,01
3,345-678,AUS,61|SLA,94|NZW,64
或者,假设您只想在第二个字段之后进行匹配,您可以在 awk 中执行此操作:
$ awk -F, -v OFS="," '{
for(i=3;i<=NF;i+=2){
if ($i~/^[A-Z]{3}$/ && $(i+1)~/^[0-9]{2}$/){
k ? k=k"|"$i","$(i+1) : k=$i","$(i+1);
}
} print $1,$2,k; k=""}' file
1,123-456,IND,91|UAE,97|USA,01
3,345-678,AUS,61|SLA,94|NZW,64