输入序列准备:FASTA格式规范、序列标识符要求、多序列文件处理

做InterProScan跑批量的序列注释,第一步就是准备输入数据。这一步看着简单,但翻车的人真不少。我这些年帮别人排查问题,十次里有四五次都是序列格式搞砸了——要么是多了一个空格,要么是标识符里混了特殊字符。你得信我,花10分钟把序列准备好,比跑完任务再重来要划算得多。

FASTA格式的核心规范

FASTA格式其实没啥复杂的,就是两条规则:

  • 描述行以 > 开头,后面跟标识符和可选的描述文字
  • 序列行只包含标准的氨基酸或核苷酸字母

但恰恰是这种简单,让人容易掉以轻心。我见过有人把序列行里混进数字,还有人把 > 前面加了空格,这些在InterProScan里都会直接报错。

# 正确示例
>sp|P04637|P53_HUMAN Cellular tumor antigen p53 OS=Homo sapiens
MEEPQSDPSVEPPLSQETFSDLWKLLPENNVLSPLPSQAMDDLMLSPDDIEQWFTEDPGP
DEAPRMPEAAPPVAPAPAAPTPAAPAPAPSWPLSSSVPSQKTYQGSYGFRLGFLHSGTAK
SVTCTYSPALNKMFCQLAKTCPVQLWVDSTPPPGTRVRAMAIYKQSQHMTEVVRRCPHH

# 错误示例1:描述行前有空格
 sp|P04637|P53_HUMAN Cellular tumor antigen p53
MEEPQSDPSVEPPLSQETFSDLWKLLPENNVLSPLPSQAMDDLMLSPDDIEQWFTEDPGP

# 错误示例2:序列行包含非法字符
MEEPQSDPSVEPPLSQETFSDLWKLLPENNVLSPLPSQAMDDLMLSPDDIEQWFTEDPGP123

我个人习惯,在提交前先用 grep -v "^>" 过滤掉描述行,然后检查剩下的行有没有非字母字符。小技巧,但很管用。

序列标识符的那些坑

很多人以为标识符随便写个名字就行。天真了。InterProScan对标识符有严格限制——说白了,它用标识符做中间文件名、数据库键值,你乱写它就乱崩。

我在项目中遇到过什么情况?有人用中文当标识符,有人用竖线 | 分隔符却忘了转义,还有人标识符里带了换行符。这些在本地跑可能没问题,但一旦上集群、走PBS调度、或者跨平台迁移时,全部炸给你看。

我建议遵循以下规范:

要求项 规范 为什么
字符集 仅使用 [a-zA-Z0-9_.-] 避免特殊字符在shell、数据库、文件系统中被解析成其他含义
长度上限 不超过100字符 超长标识符导致文件系统截断或日志行溢出
首字符 必须是字母 部分下游工具以数字开头的标识符行为不可预测
唯一性 整个文件内不能重复 InterProScan会基于标识符去重,重复时只保留第一条
我曾经踩过的坑: 标识符里有 @ 和 # 字符,在PBS脚本里被当成了变量引用符号,结果运行一半直接崩溃。跑了8个小时的作业废了。从那以后我写了个脚本,专门过滤非法字符。

怎么验证标识符?很简单,用 grep 跑一下就行:

# 检查非法字符
grep "^>" your_seqs.fasta | grep -E "[^a-zA-Z0-9_.-]" | head -5

# 检查重复标识符
grep "^>" your_seqs.fasta | sort | uniq -d

# 检查超长标识符
grep "^>" your_seqs.fasta | awk 'length($0) > 100'

这三条命令跑完,没问题了再往下走。你想想看,2000条序列一起跑,结果因为某个人的ID用了个管道符全崩了——这种情况我见过不止一次。

多序列文件的处理要点

真正的大活儿来了。单条序列好办,几十万条序列的FASTA文件,你怎么处理?InterProScan虽然是批处理工具,但它对文件结构还是有脾气。

核心要点就三个:

  1. 每个序列ID必须唯一。 —— 重名了?InterProScan不会帮你改,直接覆盖输出结果。你排查的时候还以为是某个序列没出结果,其实是结果被覆盖了。
  2. 不能有空序列。 —— 描述行后面直接接下一个 > ,中间没有序列数据。这种叫空条目,InterProScan遇到会跳过,但不报错。你以为是它跑了,其实它什么都没跑。
  3. 文件不能太大。 —— 我建议单文件不超过5万条序列,不然内存撑不住,特别是做HMMER搜索时。
我的习惯做法: 拿到大FASTA文件,先跑 seqkit stat 看一眼统计信息。序列条数、最长最短、GC含量、是否有空行,一眼全清楚。别用 wc -l,那玩意儿数的是行数不是序列数。
# 查看FASTA文件统计信息
seqkit stat input.fasta

# 拆分成每个子文件5000条序列
seqkit split -s 5000 input.fasta -o split_dir/

# 检查空序列
seqkit grep -r -p "^$" input.fasta

我曾经遇到过一个用户,他提交了3000条序列,其中200条是空序列。他问我为什么有些序列没有结果,我一排查就发现了。说白了,他那个FASTA文件是从Excel粘贴过来的,Excel的行尾处理和换行符搞得一塌糊涂。

还有个问题要注意:换行符的一致性。Windows环境下生成的 .fasta 文件,换行符是 \r\n,Linux下是 \n。InterProScan在Linux上跑,遇到 \r 会把它当成序列的一部分,导致匹配不上任何数据库。

怎么修?一行命令的事:

# 转换换行符
sed -i 's/\r$//' input.fasta

嗯,这里要注意:加了 -i 是直接修改原文件。保险起见,先备份再操作。

知识结构总览

我把上面讲的内容画了一个流程框架图,你对照着梳理一遍就好。

输入序列准备关键节点 FASTA 格式规范 描述行 > 开头 序列行 字母组成 序列标识符要求 字符集 a-zA-Z0-9_.- 长度 ≤ 100字符 首字符 必须为字母 唯一性 不可重复 多序列文件处理 ID唯一 非空序列 文件不超过5万条
总结一下我的经验:
1. 写个脚本一键校验FASTA格式 —— 别用手翻文件。
2. 标识符用 seqid_YYYYMMDD_N 这种套路,保证唯一性和可读性。
3. 大文件拆成多个子文件,并行跑InterProScan,最后合并结果。又快又稳。
4. 永远先跑一个10条序列的测试集,确认没问题了再上全量数据。