You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何扩展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而非空值
    }
}

额外说明

  1. 固定输出顺序:如果需要输出顺序和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
    }
}
  1. 允许多重匹配:如果同一行需要匹配多个正则并分别累加,移除匹配逻辑中的break语句即可。
  2. 空值处理:sums[name] + 0确保即使某个正则没有匹配到任何记录,也会输出0而非空字符串。

内容的提问来源于stack exchange,提问作者ajr_chm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:49:54