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

如何用awk按文件第1列分组输出对应第4列内容?

按第一列分组合并第四列内容

输入文件内容如下:

1   GLY     BB    1   
2   GLY     BB    2   
3   SER     BB    3   
3   SER    SC1    4   
4   PHE     BB    5   
4   PHE    SC1    6   
4   PHE    SC2    7  
4   PHE    SC3    8   
5   GLU     BB    9   
5   GLU    SC1   10 

需求:当第1列数值相同时,将对应的第4列内容用逗号合并输出,预期输出:

1
2
3,4
5,6,7,8
9,10

你之前的awk代码逻辑错误:

  • NR==FNR是多文件处理逻辑,单文件场景完全没必要
  • a[$1]=$0会覆盖同一第一列的行数据,只保留最后一行,无法收集所有第四列内容
  • 后续的判断和END块逻辑也不符合分组合并的需求

正确的awk命令(保持原顺序)

awk '{
    # 记录第一列首次出现的顺序
    if (!($1 in order)) {
        order[++count] = $1
    }
    # 累积同一第一列的第四列内容
    if (a[$1] != "") {
        a[$1] = a[$1] "," $4
    } else {
        a[$1] = $4
    }
}
END {
    # 按原顺序输出结果
    for (i=1; i<=count; i++) {
        print a[order[i]]
    }
}' file.txt

代码说明

  1. 用order数组记录第一列数值首次出现的顺序,保证输出顺序和原文件一致
  2. 用a数组以第一列数值为下标,累积对应的第四列内容:
    • 首次遇到该数值时,直接赋值第四列
    • 后续遇到时,追加逗号和当前第四列
  3. 所有行处理完成后,按order数组的顺序遍历输出a数组的内容

如果不需要严格保持顺序,也可以用简化版:

awk '{
    a[$1] = (a[$1] ? a[$1] "," : "") $4
}
END {
    for (i in a) print a[i]
}' file.txt

内容的提问来源于stack exchange,提问作者Zeus Von Venus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 18:18:22