GFF/GTF 格式基础:字段定义、必需列、版本区别与常见应用场景

做生物信息学的人,少不了跟 GFF 和 GTF 打交道。我记得刚入行那会,下载了个注释文件,两眼一抹黑,就看一堆坐标和符号。后来踩了不少坑,才把这些格式吃透。

说白了,GFF(General Feature Format)和 GTF(Gene Transfer Format)都是用来描述基因组上各种特征的文本格式。基因、转录本、外显子、CDS,甚至重复区域、变异位点,都能塞进去。它们最大的共同点就是:每行一个特征,一行 9 列,用 Tab 分隔。

九列字段,一个都不能少

不管是 GFF2、GFF3 还是 GTF2,前八列的含义完全一样。区别主要在第九列 —— 属性字段。

列号字段名说 明是否必需
1seqid染色体/contig 名称,比如 chr1、Scaffold_001是
2source注释来源,比如 Ensembl、NCBI、自己生成的是
3type特征类型,如 gene、transcript、exon、CDS是
4start起始坐标,1-based,包含该位点是
5end终止坐标,1-based,包含该位点是
6score置信度分数,通常用“.”占位是(可用 . 代替)
7strand链方向,+ 或 -,有时用 ? 表示不确定是
8phaseCDS 起始相位,0/1/2(仅在 CDS 中有效)是(可用 . 代替)
9attributes属性字段,格式因版本而异是

经验之谈:我见过不少学生把 start 和 end 写反,或者相位填错。还有人在 source 列乱写注释文本,结果下游工具直接报错。第九列最容易出问题,后面几章会重点讲怎么修复。

版本区别:GFF2 → GFF3 → GTF2

为什么会分这么多版本?因为早期大家各自为战,后来才慢慢统一。我整理了个对照表,你一看就明白。

特征GFF2GFF3GTF2(也叫 GTF)
第九列格式自由文本,键值对用空格分隔,值可有引号严格键=值,分号分隔,值必须用引号包裹键=值,分号分隔,值必须用引号包裹
层级关系无标准 ID/父节点用 ID、Parent 属性建立层级用 gene_id、transcript_id 关联
重复特征支持不统一允许多个相同类型特征(如多个外显子)类似 GFF3
推荐使用已淘汰,遇到最好转成 GFF3最通用,被各种工具广泛支持专门用于基因/转录本注释
文件扩展名.gff.gff3 或 .gff.gtf 或 .gff

我个人习惯:新项目一律用 GFF3。如果拿到的文件是 GFF2 或者老式 GTF,先用 gffread 转一下,省得后面被坑。

常见应用场景

GFF/GTF 几乎贯穿所有基因组相关分析。我挑几个最常用的场景说说。

  • RNA-seq 定量(如 featureCounts、htseq-count):需要一个 GTF 文件来定义基因和转录本结构。如果里面 exon 坐标写错了,定量结果直接废掉。
  • 变异注释(如 VEP、SnpEff):依赖 GFF3 来确定变异落在哪个基因、哪个转录本、哪个外显子上。属性字段不对,注释就会丢失或出错。
  • 可视化(IGV、JBrowse):加载注释文件时,I 列必须格式正确,否则浏览器不显示或者显示错位。
  • 基因组组装评估(BUSCO、QUAST):有时也用 GFF 来评估注释完整性。我遇到过因为第九列缺失 ID,BUSCO 直接跳过一整个基因的情况。

你想想看,这些场景里只要一个坐标偏差或属性格式错误,结果就全变了。所以打好格式基础,比学那些花哨算法更重要。

第1章 知识图谱:GFF/GTF 格式核心 9列 Tab分隔 规范 GFF2 第九列自由文本 已淘汰 GFF3 严格的键=值对 ID/Parent 层级 GTF2 gene_id/transcript_id 用于基因注释 常见应用 RNA-seq / 变异注释 可视化 / 组装评估 第九列属性字段是版本区分的关键,也是错误高发区

我曾经遇到过这样一个案例:一个 GFF2 文件被下游工具当成 GFF3 解析,结果第九列里没加引号的值全被切碎了。最后不得不写个脚本逐行修复。记住:永远确认你的文件版本,不要信任文件扩展名。

好了,这一章的格式基础就这些。后面我们会一个错误一个错误地排查,每个修复方法我都会附上真实案例。你先把九列字段记住,版本区别分得清,后面操作才不糊涂。