Bash处理ref_ID.gz按SNo分块并聚合Count总和及NY/CA行数问题
解决方案
你现有代码的核心问题是没有按SNo维度分组统计,且重复解压同一份文件性能较差。可以通过单次awk处理直接完成按SNo的分组聚合,修改后完整脚本如下:
# 提取Collections.txt中的唯一ID值 cut -d"|" -f2 Collections.txt | sort -n | uniq > uniq_ids.txt # 遍历每个ID处理对应压缩文件 while read -r id; do # 仅解压1次文件,用awk完成所有分组统计逻辑 zcat "ref_${id}.gz" | awk -F',' -v id="${id}" ' # 跳过表头行 NR == 1 {next} { s_no = $1 # 存储所有出现过的SNo,用于后续遍历输出 all_snos[s_no] = 1 # 统计当前SNo对应NY的行数 if ($3 == "NY") ny_count[s_no]++ # 统计当前SNo对应CA的行数 if ($3 == "CA") ca_count[s_no]++ # 累加当前SNo对应Count字段总和 total_count[s_no] += $4 } END { # 遍历所有SNo输出结果 for (s in all_snos) { ny = (s in ny_count) ? ny_count[s] : 0 ca = (s in ca_count) ? ca_count[s] : 0 total = (s in total_count) ? total_count[s] : 0 printf "For ref_%s.gz, for SNo : %s, NY = %d, CA = %d, Count = %d\n", id, s, ny, ca, total } } ' done < uniq_ids.txt
优化说明
- 单次解压文件即可完成所有统计,大文件场景下性能提升明显
- 用awk数组以SNo为键存储统计值,天然实现按SNo分组的需求
- 兼容空值场景,某SNo无对应NY/CA记录时会自动输出0而非空值
- 自动跳过表头行,避免表头参与统计出现计算错误
- 若需要按SNo排序输出,可在awk的END块中通过
asorti函数对SNo数组排序后再遍历输出
内容的提问来源于stack exchange,提问作者Supratim Das
相关产品推荐
相关产品推荐

