基于前三列匹配合并重复行并合并指定列内容的技术问询
合并相同前三列的文本行
问题描述
输入制表符分隔的文本:
chr1 13369510 13369602 PRAMEF18 0 + chr1 13369510 13369602 PRAMEF19 0 +
需求:对比每行前三列,若内容完全匹配则合并为一行,第四列用逗号分隔,其余列保持不变。期望输出:
chr1 13369510 13369602 PRAMEF18,PRAMEF19 0 +
解决方案
使用awk命令处理,脚本如下:
BEGIN {FS=OFS="\t"} { key = $1 FS $2 FS $3 if (!(key in data)) { data[key] = $4 rest[key] = $5 FS $6 } else { data[key] = data[key] "," $4 } } END { for (k in data) { print k, data[k], rest[k] } }
使用方法
- 将上述脚本保存为
merge_lines.awk - 运行命令:
awk -f merge_lines.awk input.txt
或者直接执行单行命令:
awk 'BEGIN {FS=OFS="\t"} {key=$1 FS $2 FS $3; if(!(key in data)){data[key]=$4; rest[key]=$5 FS $6}else{data[key]=data[key]","$4}} END{for(k in data) print k, data[k], rest[k]}' input.txt
说明
- 脚本以前三列的组合作为唯一标识键,将匹配行的第四列值用逗号拼接累加
- 默认假设匹配行的第五、六列内容一致,若存在不一致场景,需额外添加逻辑处理
内容的提问来源于stack exchange,提问作者sawasthi
相关产品推荐
相关产品推荐

