使用 AWK 命令进行模式检查

使用 AWK 命令进行模式检查

我有如下格式的 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

相关内容