FastQ 文件格式详解

做NGS数据处理,天天跟FastQ打交道。说白了这个格式就是测序仪吐出来的原始数据,里面既存序列,也存质量值。我刚开始接触的时候觉得就是个文本嘛,后来踩过坑才知道,细节决定成败。

1. 什么是FastQ?

FastQ是基于FASTA扩展而来的格式,每一条read占四行。你拿文本编辑器打开一个.fastq文件,看到的应该是一个规律的四行循环。

@EAS139:136:FC706VJ:2:2104:15343:197393 1:Y:18:ATCACG
CTACGTCCATCGTGAGCTCGATCGCTAGCTGATCGTAGCTAGCTAGC
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

这四行分别对应:

  • 第1行(标识行):以@开头,包含测序仪器、流动槽位置、坐标等元信息。
  • 第2行(序列行):碱基序列,ATCGN。
  • 第3行(分隔行):以+开头,可以重复描述信息,通常省略或用单个+。
  • 第4行(质量行):与序列等长的字符,每个字符编码一个Phred质量分数。

关键点:序列行长度必须等于质量行长度。一旦不等,下游工具直接报错。我曾在项目中遇到过一条read就因为测序仪内部bug导致质量行短了一个碱基,跑bwa时卡死半小时才查到原因。

2. 质量值的编码方式

质量值字符是啥意思?每个字符对应一个ASCII码,减去一个偏移量得到Phred质量分数 Q = -10 * log10(P)。P是碱基测序错误的概率。

目前主流是 Sanger 编码(Phred+33),质量值范围0~41,对应ASCII 33~74。Illumina早期用过Phred+64(ASCII 64~126),不过现在基本统一了。

编码方式ASCII范围质量值范围常见平台
Sanger / Illumina 1.8+33 ~ 1260 ~ 93(实际0~41)Illumina HiSeq/MiSeq/NovaSeq
Illumina 1.3~1.764 ~ 1260 ~ 62旧版本Genome Analyzer
Solexa59 ~ 126-5 ~ 62早期Solexa

个人习惯:拿到一个陌生FastQ先跑seqtk fqchk或者fastqc,它会自动识别编码类型。别信文件名里的“1.8+”,我吃过亏——供应商给的“Sanger”文件实际是Illumina1.5标准,差很多。

3. FastQ文件中的元信息

标识行里藏着大量信息,尤其在做双端比对、统计流向时特别有用。标准Illumina格式长这样:

@INSTRUMENT:FLOWCELL:LANE:TILE:X:Y READ:ISFILTERED:CONTROLBITS:INDEX

举个例子:

@EAS139:136:FC706VJ:2:2104:15343:197393 1:Y:18:ATCACG
字段含义示例值
INSTRUMENT测序仪名称EAS139
FLOWCELL流动槽ID136
LANE泳道编号2
TILEtile编号2104
X:Y簇在tile内的坐标15343:197393
READread编号(1或2)1
ISFILTERED是否通过质控(Y/N)Y
CONTROLBITS控制位18
INDEXIndex序列ATCACG

注意:双端测序时Read1和Read2的标识行前半段相同,仅READ字段为1或2。千万不要在排序或去重时只靠标识行尾部判断,容易混淆。我曾经写脚本时用整行做key,结果双端匹配全乱套,后来才改成只取头部到第一个空格的部分。

4. FastQ中的碱基符号

除了标准的A、T、C、G,你还会见到N和IUPAC简并码。N代表任意碱基,通常出现在低质量区域。部分平台(如PacBio)会用IUPAC符号表示混合碱基,但Illumina数据里几乎只有ATCGN。

符号含义
A腺嘌呤
C胞嘧啶
G鸟嘌呤
T胸腺嘧啶
N任意碱基(无法确定)

处理的时候我习惯统计N的占比。如果一条read里N超过10%,基本就是低质量序列,直接丢掉省事。Seqtk的seq -n能把含N的记录单独拎出来。

5. FastQ格式的常见问题与避坑

  • 换行符问题:Windows的CRLF和Linux的LF混用会导致解析错乱。建议拿到数据先用dos2unix修正。
  • 质量行长度不符:有的工具会在序列行末尾加空格,质量行却不加。用awk '{if(NR%4==2) print length($0)}'检查长度分布。
  • 标识行重复:如果两条read的标识行完全一样,下游工具可能报“duplicate read ID”错误。实际很少见,一旦出现多半是拼接或拆分错误。
  • 压缩格式:FastQ通常用gzip压缩(.fastq.gz),注意gzip的完整性,使用gzip -t验证。

千万不要手动用Excel打开FastQ!Excel会自动把"@EAS139"识别成日期格式,并且截断长行。我见过有人把几GB的FastQ弄坏,后悔都来不及。

6. FastQ格式的SVG结构图

下面这张图展示了一条FastQ记录从标识行到质量行的完整结构,以及各个字段的含义。

FastQ 四行结构 行1(标识行): @EAS139:136:FC706VJ:2:2104:15343:197393 1:Y:18:ATCACG 行2(序列行): CTACGTCCATCGTGAGCTCGATCGCTAGCTGATCGTAGCTAGCTAGC 行3(分隔行):+(可重复描述) 行4(质量行): IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 长度相等 (L) 标识行字段分解: @仪器:流动槽:泳道:tile:X:Y 读长编号:是否过滤:控制位:Index

7. 实用命令行速查

日常工作中我经常用下面几个命令来检查和操作FastQ:

# 查看前N条记录
zcat sample.fastq.gz | head -n 4

# 统计序列条数(行数/4)
zcat sample.fastq.gz | echo $(( $(wc -l) / 4 ))

# 检查质量行长度是否一致
zcat sample.fastq.gz | awk 'NR%4==2 {print length}' | sort | uniq -c

# 查看质量值分布(使用seqtk)
seqtk fqchk -q30 sample.fastq.gz

小技巧:我习惯先zcat | head -1000 | fastqc stdin快速预览,等数据确认没问题再跑全量。可以节省不少时间。

FastQ格式看起来简单,但实际操作中编码混淆、长度错位、标识行歧义都是常见坑。把基础打牢,后面的质控、比对、变异检测才能站得稳。