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

如何提取两文件特定列匹配值的行并合并生成新文件

问题描述

现有两个制表符分隔的文件(各含数千行数据):

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:42:36