如何对比两个TSV文件:指定列匹配标记Fail,否则标记Pass?
问题分析与解决方案
需求
对比两个带表头的TSV文件:
- 检查
peptide.tsv的第6列(AA_seq_full)是否与proteome.tsv的第2列(AA_seq)完全匹配 - 匹配则输出
Fail,不匹配则输出Pass peptide.tsv的第6列允许存在非唯一值,相同序列可对应不同基因座
错误原因
你之前的awk命令存在两个核心问题:
- 字段分隔符解析错误:
-F\\t在shell环境下无法正确解析为制表符,awk默认使用空白(空格+制表符)作为分隔符,导致带空格的字段(比如proteome.tsv的第1列)被拆分,字段编号完全混乱,最终$6和$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 }
命令说明
- BEGIN块:明确设置输入(
FS)和输出(OFS)分隔符为制表符,严格遵循TSV格式,避免字段拆分错误。 - 处理proteome.tsv:
NR == FNR仅匹配第一个输入文件NR > 1跳过表头行,将第2列的序列存入proteome数组作为匹配基准
- 处理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
相关产品推荐
相关产品推荐

