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

如何按递进分组规则对多字段数据文件进行值聚合求和?

实现方法与思路

准备文件

假设:

  • 数据文件命名为 data.txt,内容如下:
ID1;ID2;ID3;VALUE  
1000;100;01;12
1000;100;02;4129
1000;100;03;128
1000;100;04;412
1000;100;05;12818
1000;100;06;4129
1000;100;07;546
1000;100;08;86
1000;100;09;12818
1000;100;10;754
1000;100;11;2633
1000;100;12;571
1000;200;01;13
1000;200;02;319
1000;200;03;828
1000;200;04;46
1000;200;05;118
1000;200;06;41
1000;200;07;546
1000;200;08;86
1000;200;09;129
1000;200;10;7564
1000;200;11;233
1000;200;12;572
  • 分组规则文件命名为 rules.txt,内容如下:
01

01
02

01
02
03

01
02
03
04

01
02
03
04
05

01
02
03
04
05
06

01
02
03
04
05
06
07

01
02
03
04
05
06
07
08

01
02
03
04
05
06
07
08
09

01
02
03
04
05
06
07
08
09
10

01
02
03
04
05
06
07
08
09
10
11

01
02
03
04
05
06
07
08
09
10
11
12

用Awk脚本实现

将以下代码保存为 calculate.awk:

BEGIN {
    FS = ";"  # 设置字段分隔符为分号
    OFS = ";"
    rule_idx = 0
}

# 先读取规则文件,解析每个分组的ID3列表
NR == FNR {
    if ($0 == "") {  # 空行表示一个分组结束
        if (current_group != "") {
            rule_idx++
            group_ids[rule_idx] = current_group
            current_group = ""
        }
        next
    }
    current_group = current_group (current_group ? "|" : "") $0  # 用竖线分隔分组内的ID3
    next
}

# 处理数据文件,存储每个ID1+ID2+ID3对应的VALUE
FNR == 1 {
    print $0  # 输出表头
    next
}
{
    key = $1 "," $2
    id3_val[key, $3] = $4
    if (!(key in groups)) {
        groups[count++] = key
    }
}

# 所有数据读取完成后,按规则计算并输出
END {
    # 处理规则文件最后一个分组
    if (current_group != "") {
        rule_idx++
        group_ids[rule_idx] = current_group
    }

    # 遍历每个ID1+ID2组合
    for (g = 0; g < count; g++) {
        split(groups[g], ids, ",")
        id1 = ids[1]
        id2 = ids[2]

        # 遍历每个规则分组
        for (r = 1; r <= rule_idx; r++) {
            split(group_ids[r], id3_list, "|")
            current_sum = 0
            detail = ""
            # 计算当前分组的VALUE总和
            for (i in id3_list) {
                id3 = id3_list[i]
                if ((groups[g] "," id3) in id3_val) {
                    val = id3_val[groups[g] "," id3]
                    current_sum += val
                    detail = detail (detail ? "+" : "") val
                }
            }

            # 生成输出行的VALUE部分
            value_str = current_sum
            if (r > 1) {
                value_str = value_str " (" detail ")"
            }

            # 输出当前行
            printf "%s;%s;M%02d;%s\n", id1, id2, r, value_str

            # 第12个分组后输出分隔线
            if (r == 12) {
                print "---"
            }
        }
        # 不同ID1+ID2组合之间空行分隔
        if (g < count - 1) {
            print ""
        }
    }
}

运行脚本

在终端执行命令:

awk -f calculate.awk rules.txt data.txt

脚本说明

  1. 规则解析:先读取规则文件,将空行分隔的分组转化为ID3列表,用竖线分隔存储,同时记录分组序号。
  2. 数据存储:读取数据文件时,把每个ID1+ID2+ID3对应的VALUE存入数组,同时记录所有唯一的ID1+ID2组合。
  3. 计算输出:遍历每个ID1+ID2组合,再遍历每个规则分组,计算分组内VALUE总和并生成明细字符串,最后按要求格式输出,包括M01/M02这类分组标识、不同组合间的空行、第12组后的分隔线。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:45:33