如何提取两文件特定列匹配值的行并合并生成新文件
问题描述
现有两个制表符分隔的文件(各含数千行数据):
File1 内容
anno1.g20653.t1 anno1.g20674.t1 eud1g02416 eud1g02458 27 + anno2.g3796.t1 anno1.g20698.t1 eud1g02520 eud1g02556 28 +
File2 内容
scaffold_1 transcript 11256 13613 anno1.g20653.t1 scaffold_1 transcript 25598 47989 anno1.g20066.t2
需求
当 File1 第1列的元素存在于 File2 第5列时,将匹配的两行以制表符分隔合并后输出到 File3,忽略无匹配的行。期望输出的 File3 内容如下:
anno1.g20653.t1 anno1.g20674.t1 eud1g02416 eud1g02458 27 + scaffold_1 transcript 11256 13613 anno1.g20653.t1
尝试过的命令(未达到预期)
awk 'FNR==NR {a[$1]; next} FNR> 1 && $5 in a' File1 File2 > File3
该命令仅提取了 File2 中的匹配行,未合并 File1 的对应行。
解决方案
Awk 实现
核心思路是先读取 File2,用第5列作为键存储整行内容;再读取 File1,匹配后拼接两行输出:
awk 'BEGIN {FS=OFS="\t"} FNR==NR {a[$5]=$0; next} $1 in a {print $0, a[$1]}' File2 File1 > File3
BEGIN {FS=OFS="\t"}:指定输入输出分隔符为制表符,保证格式一致性FNR==NR {a[$5]=$0; next}:处理第一个文件(File2),将第5列值作为键,整行内容作为值存入数组$1 in a {print $0, a[$1]}:处理第二个文件(File1),若第1列存在于数组中,拼接当前行与对应 File2 行输出
Python 实现
适合处理超大文件或需要扩展逻辑的场景:
# 构建 File2 中 ID 到整行的映射 id_to_line = {} with open("File2", "r") as f2: for line in f2: line = line.strip() parts = line.split("\t") if len(parts) >= 5: id_to_line[parts[4]] = line # 处理 File1 并生成结果 with open("File1", "r") as f1, open("File3", "w") as f3: for line in f1: line = line.strip() if not line: continue first_col = line.split("\t")[0] if first_col in id_to_line: merged_line = f"{line}\t{id_to_line[first_col]}" f3.write(f"{merged_line}\n")
- 先遍历 File2 存储映射关系,避免重复读取
- 遍历 File1 时直接匹配映射,拼接符合条件的行写入结果文件
内容的提问来源于stack exchange,提问作者rseg
相关产品推荐
相关产品推荐

