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

如何使用awk按指定列唯一值同时聚合多列字段值?

解决方案

刚好可以在你现有单字段聚合的awk逻辑上扩展,新增一个数组来跟踪第3列的聚合值,同时处理空值的情况(比如输入里2|dev||44|plus这种第3列为空的场景,聚合时要保留这个空值)。

修改后的完整awk命令如下:

awk -F"|" '
{
    key = $1 "|" $2
    # 处理第3列的聚合逻辑
    if (col3[key]) {
        col3[key] = col3[key] ";" $3
    } else {
        col3[key] = $3
    }
    # 处理第5列的聚合逻辑,和原逻辑一致但单独用数组存储
    if (col5[key]) {
        col5[key] = col5[key] ";" $5
    } else {
        col5[key] = $5
    }
}
END {
    # 遍历所有唯一分组,拼接输出结果
    for (key in col3) {
        print key "|" col3[key] "|" col5[key]
    }
}' OFS="|" input

命令细节解释

  • 首先用key = $1 "|" $2生成第1、2列的唯一组合键,作为分组的标识;
  • 我们创建了两个独立数组col3和col5,分别存储对应列的聚合结果:
    • 如果当前分组键已经存在,就用分号拼接当前行的列值;
    • 如果是首次遇到该分组键,直接将当前列值赋值给数组元素;
  • 在END块中,遍历所有唯一分组键,把分组键、第3列聚合值、第5列聚合值用|拼接后输出,完美匹配你要的格式。

测试验证

用你提供的输入数据测试:

1|dev|Smith|78|minus
1|ana|jhon|23|plus
1|ana|peter|22|plus
2|dev|dash|45|minus
2|dev||44|plus

执行命令后会输出:

1|dev|Smith|minus
1|ana|jhon;peter|plus;plus
2|dev|dash;|minus;plus

完全符合你期望的输出结果,包括空值的聚合处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:24:40