如何按递进分组规则对多字段数据文件进行值聚合求和?
实现方法与思路
准备文件
假设:
- 数据文件命名为
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
脚本说明
- 规则解析:先读取规则文件,将空行分隔的分组转化为ID3列表,用竖线分隔存储,同时记录分组序号。
- 数据存储:读取数据文件时,把每个
ID1+ID2+ID3对应的VALUE存入数组,同时记录所有唯一的ID1+ID2组合。 - 计算输出:遍历每个
ID1+ID2组合,再遍历每个规则分组,计算分组内VALUE总和并生成明细字符串,最后按要求格式输出,包括M01/M02这类分组标识、不同组合间的空行、第12组后的分隔线。
内容的提问来源于stack exchange,提问作者TedroyG
相关产品推荐
相关产品推荐

