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

如何对比两个TSV文件:指定列匹配标记Fail,否则标记Pass?

问题分析与解决方案

需求

对比两个带表头的TSV文件:

  • 检查peptide.tsv的第6列(AA_seq_full)是否与proteome.tsv的第2列(AA_seq)完全匹配
  • 匹配则输出Fail,不匹配则输出Pass
  • peptide.tsv的第6列允许存在非唯一值,相同序列可对应不同基因座

错误原因

你之前的awk命令存在两个核心问题:

  1. 字段分隔符解析错误:-F\\t在shell环境下无法正确解析为制表符,awk默认使用空白(空格+制表符)作为分隔符,导致带空格的字段(比如proteome.tsv的第1列)被拆分,字段编号完全混乱,最终$6和$2都指向了错误的内容,状态文本被错误插入到字段中间。
  2. 未跳过表头行:没有排除两个文件的表头,导致proteome.tsv的表头AA_seq被存入匹配数组,peptide.tsv的表头行也被错误判断状态。

正确的awk命令

BEGIN { FS = "\t"; OFS = "\t" }
NR == FNR {
    if (NR > 1) proteome[$2]
    next
}
{
    if (FNR == 1) {
        print $0, "Status"
        next
    }
    status = ($6 in proteome) ? "Fail" : "Pass"
    print $0, status
}

命令说明

  1. BEGIN块:明确设置输入(FS)和输出(OFS)分隔符为制表符,严格遵循TSV格式,避免字段拆分错误。
  2. 处理proteome.tsv:
    • NR == FNR仅匹配第一个输入文件
    • NR > 1跳过表头行,将第2列的序列存入proteome数组作为匹配基准
  3. 处理peptide.tsv:
    • FNR == 1匹配表头行,输出原表头并追加Status列标题
    • 其他行判断第6列是否存在于proteome数组中,输出原行内容并追加对应的Fail/Pass状态

测试结果

针对你提供的测试文件,执行命令后会输出:

FusionID        Peptide HLA_Allele      EL-score        EL_Rank AA_seq_full     Status
TUFT1--PBXIP1|chr1:151540426:+|chr1:154951535:-|FRAMESHIFT      GSDGCWGLY       HLA-A01:01      0.79990000000000006     0.1002  MNGTRNWCTLVDVHPEDQAAGRSSRLKALSLAAF*QRRLRSRAPWKVMFVVWSLLAQETQ*SRETCRRPP Pass
TUFT1--PBXIP1|chr1:151540426:+|chr1:154948366:-|FRAMESHIFT      GSDGCWGLY       HLA-A01:01      0.79990000000000006     0.1002  MNOVEL*PEPTIDE Pass

(注:根据你提供的测试文件,第一个序列与proteome.tsv的第2列末尾差一个T,因此输出Pass;若需匹配你给出的期望输出,请检查测试文件的序列是否一致)

内容的提问来源于stack exchange,提问作者shafaque

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 11:57:32