如何用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
代码说明
- 用
order数组记录第一列数值首次出现的顺序,保证输出顺序和原文件一致 - 用
a数组以第一列数值为下标,累积对应的第四列内容:- 首次遇到该数值时,直接赋值第四列
- 后续遇到时,追加逗号和当前第四列
- 所有行处理完成后,按
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
相关产品推荐
相关产品推荐

