如何扩展AWK脚本以支持多正则匹配并汇总$3列数值
多正则匹配的AWK数值汇总脚本改造
需求说明
我原本有一段匹配单个正则表达式、汇总对应行第3列数值的AWK单行命令,也改成了单规则匹配的AWK脚本。现在需要修改这个脚本,让它支持多个正则表达式,分别匹配记录并汇总对应第3列的数值,最终输出每个匹配正则与对应汇总值的列表。
相关参考信息
- 原AWK单行命令:
awk -F "|" '$2 ~ /BYRON PHARMACY/ {sum += $3} END {print "BYRON PHARMACY" sum}' > data_file
- 该命令的输出示例:
BYRON PHARMACY 24.95 - 多正则匹配后的期望输出:
BYRON PHARMACY 24.95 AMAZON AU 49.98 BYRON IGA 4.90 AGL 405.59
- 现有单正则匹配AWK脚本:
#!/usr/bin/awk -f BEGIN { FS = "|" sum = 0 } $2 ~ /BYRON IGA/ {sum += $3} END { print "BYRON IGA", sum }
改造后的脚本方案
使用AWK的关联数组存储每个目标正则对应的汇总值,遍历匹配后输出结果:
#!/usr/bin/awk -f BEGIN { FS = "|" # 定义需要匹配的正则表达式及其对应的显示名称 targets["BYRON PHARMACY"] = /BYRON PHARMACY/ targets["AMAZON AU"] = /AMAZON AU/ targets["BYRON IGA"] = /BYRON IGA/ targets["AGL"] = /AGL/ } # 逐行检查是否匹配目标正则,匹配则累加对应数值 { for (name in targets) { if ($2 ~ targets[name]) { sums[name] += $3 break # 同一行仅匹配第一个符合的正则,避免重复累加 } } } END { # 输出所有目标的汇总结果 for (name in targets) { print name, sums[name] + 0 # +0确保未匹配时输出0而非空值 } }
额外说明
- 固定输出顺序:如果需要输出顺序和
targets定义的顺序一致,可以在BEGIN块中添加顺序数组,示例:
BEGIN { FS = "|" # 定义输出顺序 order[1] = "BYRON PHARMACY" order[2] = "AMAZON AU" order[3] = "BYRON IGA" order[4] = "AGL" # 绑定正则与名称 targets["BYRON PHARMACY"] = /BYRON PHARMACY/ targets["AMAZON AU"] = /AMAZON AU/ targets["BYRON IGA"] = /BYRON IGA/ targets["AGL"] = /AGL/ } # ... 中间匹配逻辑不变 ... END { for (i=1; i<=length(order); i++) { name = order[i] print name, sums[name] + 0 } }
- 允许多重匹配:如果同一行需要匹配多个正则并分别累加,移除匹配逻辑中的
break语句即可。 - 空值处理:
sums[name] + 0确保即使某个正则没有匹配到任何记录,也会输出0而非空字符串。
内容的提问来源于stack exchange,提问作者ajr_chm
相关产品推荐
相关产品推荐

