如何基于染色体与位置列精准匹配合并两个文件?
问题描述
需要合并两个文件:
- output_armlympho.txt:共5778行,15列,示例内容:
NUMBER CHROM POS ID REF ALT A1 TEST OBS_CT BETA SE L95 U95 T_STAT P 42484 1 18052645 rs260514:18052645:G:A G A G ADD 1597 0.0147047 0.0656528 -0.113972 0.143382 0.223977 0.822804 42485 1 18054638 rs35592535:18054638:GC:G GC G G ADD 1597 0.0138673 0.0269643 -0.0389816 0.0667163 0.514286 0.607124 42486 7 18054785 rs1572792:18054785:G:A G A A ADD 1597 -0.0126002 0.0256229 -0.0628202
- file1:共25958247行,16列,示例内容:
column1 column2 column3 column4 column5 column6 column7 column8 column9 column10 column11 column12 column13 column14 column15 column16 1 chr1_10000044_A_T_b38 ENS 171773 29 30 0.02 0.33 0.144 0.14 chr1 10000044 A T chr1 10060102 2 chr7_10000044_A_T_b38 ENS -58627 29 30 0.024 0.26 0.16 0.15 chr7 10000044 A T chr7 18054785 4 chr1_10000044_A_T_b38 ENS 89708 29 30 0.0 0.03 -0.0 0.038 chr1 10000044 A T chr1 18054638 5 chr1_10000044_A_T_b38 ENS -472482 29 30 0.02 0.16 0.11 0.07 chr1 10000044 A T chr1 18052645
合并需求
- 匹配规则:
output_armlympho.txt的第2列(CHROM,数字格式)、第3列(POS)与file1的第15列(column15,chr+数字格式)、第16列(column16)精准匹配 - 适配染色体格式差异(数字 vs
chr+数字) file1存在重复行,两个文件排序不一致- 输出需包含两个文件的所有列
用户之前尝试的错误命令:
awk 'NR==FNR {Tmp[$3] = $16 FS $4; next} ($16 in Tmp) {print $0 FS Tmp[$16]}' output_armlympho.txt file1 > test
正确实现方案
使用以下awk命令完成合并:
awk ' NR==FNR { if (FNR == 1) { output_header = $0 next } # 构建唯一匹配键:chr+染色体号+_+位置 key = "chr" $2 "_" $3 map[key] = $0 next } { if (FNR == 1) { # 输出合并后的表头 print $0, output_header next } # 提取file1的染色体号(去掉chr前缀)和位置,构建匹配键 chrom_num = substr($15, 4) pos = $16 match_key = "chr" chrom_num "_" pos # 匹配成功则输出合并行 if (match_key in map) { print $0, map[match_key] } } ' output_armlympho.txt file1 > merged_result.txt
命令解释
- 索引构建阶段(处理output_armlympho.txt)
- 读取第一行时保存文件表头到
output_header变量,用于后续合并表头 - 对数据行,用
chr+CHROM列(数字)+_+POS列拼接成唯一键,将整行内容存入map数组,确保每个染色体-位置组合对应唯一的output行
- 读取第一行时保存文件表头到
- 合并阶段(处理file1)
- 读取第一行时,输出
file1的表头加上output_armlympho.txt的表头,完成表头合并 - 对数据行,通过
substr($15,4)提取column15中chr后的数字部分,再和column16的位置拼接成和索引一致的匹配键 - 如果匹配键存在于
map数组中,就输出当前file1的行加上对应的output_armlympho.txt行内容
- 读取第一行时,输出
- 优势
- 精准匹配染色体和位置,避免单字段匹配的歧义
- 自动适配染色体格式差异
- 不依赖文件排序,支持
file1中的重复行匹配输出
内容的提问来源于stack exchange,提问作者HKJ3
相关产品推荐
相关产品推荐

