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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 17:36:07