第3章 高通量测序数据格式基础:FASTA、FASTQ、GFF/GTF 格式详解
我记得刚入行那会儿,拿到第一个 RNA‑seq 项目,一堆看不懂的文件后缀直接把我干懵了。.fasta、.fastq、.gtf……每个文件打开都像天书。后来踩了不少坑,才把这些格式的脾气摸清楚。今天咱们就把这三兄弟彻底聊透。
说白了,这三个格式负责的事完全不同:FASTA 存参考序列,FASTQ 存测序读段,GFF/GTF 存基因组注释。你想想看,没有它们,差异分析连第一步都迈不出去。
3.1 FASTA 格式——参考基因组的“标准字典”
FASTA 是最基础的序列格式。结构极其简单:一行以 > 开头的描述行,后面跟实际的 DNA/RNA/蛋白质序列。
一个典型的 FASTA 文件长这样:
>chr1 AC:12345
AGCTTAGCTAGCTAGCGTACGATCGATCGATCGTAGCTAGCTAGCTAGC
GCTAGCTAGCTAGCTAGGCTAGCTAGCTAGCTAGCTAGCTAGCTAGC
我习惯把 > 后面的部分叫做“头信息”。这里面可以塞各种 ID、物种名、染色体号。序列行可以换行,但别加空格——我以前犯过这个错,BWA 直接报错说非法字符。
避坑指南: 我曾在项目中遇到过某供应商给的参考基因组,FASTA 序列行末尾多了 \r\n 导致比对软件崩溃。记得用 dos2unix 一键转换。
FASTA 的用途很广:参考基因组、转录本序列、蛋白库都靠它。但在 RNA‑seq 里,我们通常用来自 UCSC/Ensembl/NCBI 的参考基因组 FASTA。建议下载时注意版本号,比如 hg38、mm10,不然回头比对结果对不上。
3.2 FASTQ 格式——测序仪吐出来的“原始凭证”
FASTQ 跟 FASTA 最大的区别:它带了质量评分。每条记录占 4 行:
@EAS139:136:FC706VJ:2:2104:15343:197393 1:Y:18:ATCACG
GTATCATCATCTAGCTAGTACGTATCGTACGTACGTACGATCGTACGTAGC
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
第一行是 @ 开头的 ID(注意跟 FASTA 的 > 区分);第二行是序列;第三行只有 +,后面可带可选 ID(现代测序平台通常留空);第四行是质量字符串,每个字符对应一个碱基的测序质量。
质量值怎么算?Phred 质量分数 Q = -10 * log₁₀(P),P 是碱基出错的概率。比如 Q=30 表示错误概率 0.1%,准确率 99.9%。我一般把 Q<20 的碱基当作低质量过滤掉。
注意编码版本! Illumina 1.8+ 用 Phred+33(ASCII 33-126),老版本用 Phred+64。混用的话,质量值可能完全错位。我吃过一次亏——用 FastQC 检查时发现质量分布诡异,才发现是 SRA 下载的数据用了旧编码。
实际项目中,FASTQ 文件通常经过 gzip 压缩(.fastq.gz)。直接解压会占大量磁盘,我建议使用 zcat、seqtk 或 samtools fastq 等工具流式处理,不落地解压。
3.3 GFF / GTF 格式——基因组的“地图注释”
这两个格式都是表格形式的注释文件,用 9 列制表符分隔。GFF(General Feature Format)版本 3 最常用;GTF(Gene Transfer Format)可以理解为 GFF 的一个简化变种,专门为基因结构设计。
GFF3 的 9 列分别是:
| 序号 | 列名 | 说明 |
|---|---|---|
| 1 | seqid | 染色体/ scaffold ID |
| 2 | source | 注释来源(如 Ensembl、NCBI) |
| 3 | type | 特征类型(gene, transcript, exon, CDS 等) |
| 4 | start | 起始坐标(1-based) |
| 5 | end | 终止坐标 |
| 6 | score | 置信度(通常用 . 占位) |
| 7 | strand | 链方向 + 或 - |
| 8 | phase | CDS 起始偏移(0,1,2;非 CDS 特征用 .) |
| 9 | attributes | 键值对列表,分号分隔(如 gene_id "ENSG001"; transcript_id "ENST001") |
GTF 与 GFF3 的区别主要在第九列。GTF 要求所有属性用引号括起来,且包含 gene_id 和 transcript_id。我习惯用 GTF 做 RNA‑seq 定量,因为很多工具(如 featureCounts)对 GTF 解析更稳定。
实战技巧: 我写 pipeline 时,会先用 grep -P '\tgene\t' 看有多少基因,再用 cut -f9 | cut -d';' -f1 | sort -u | wc -l 检查基因 ID 是否冗余。如果一个 gene_id 出现多次,说明注释文件可能合并了多个转录本版本——这并不罕见,但做差异分析时要留意。
另一个常见坑:染色体 ID 格式不一致。例如 UCSC 用 chr1,Ensembl 用 1。FASTA 与 GTF 的 seqid 必须匹配,否则比对结果无法转换成基因计数。我曾经花了一整天排查为什么 90% 的 reads 没被分配到基因,最后发现是染色体名字没对上。
三种格式的对比与在 RNA‑seq 中的角色
我把核心区别总结成下面这张表,方便你快速查阅:
| 特性 | FASTA | FASTQ | GFF/GTF |
|---|---|---|---|
| 主要数据 | 参考序列(DNA/RNA/蛋白) | 测序读段 + 质量 | 基因组注释(基因、转录本、外显子等) |
| 行数 / 记录 | 2 行(描述+序列) | 4 行(ID, 序列, +, 质量) | 9 列制表符 |
| 是否包含质量 | 否 | 是 | 否 |
| 典型扩展名 | .fa, .fasta, .fna |
.fastq, .fq |
.gff, .gff3, .gtf |
| RNA‑seq 中的作用 | 构建参考索引(比对所需的模板) | 比对/定量的输入(原始数据) | 定义特征区域用于基因水平定量 |
核心要点: RNA‑seq 差异分析 pipeline 的起点就是这三个格式的对齐。FASTA 和 GTF 属于“静态参考资源”,FASTQ 是“动态实验数据”。你可以在网上找到同物种同一版本的参考资源,但 FASTQ 永远是你自己的实验数据。
我记得第一次自己构建索引时,用的是 STAR --runMode genomeGenerate,需要同时提供 FASTA 和 GTF。如果不小心把不同来源的 FASTA 和 GTF 混用,索引能建出来,但后面比对时外显子边界会对不准——结果就是大量的 reads 被标为“unmapped”。
最后说一句:千万别忽视格式检查。写 pipeline 时,我会在第一步加入格式验证:seqtk test 检查 FASTQ,gffread --validate 检查 GTF。这些小动作能省掉无数调试时间。至少我是这么干的——你也不妨试试。