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 ~ 126 | 0 ~ 93(实际0~41) | Illumina HiSeq/MiSeq/NovaSeq |
| Illumina 1.3~1.7 | 64 ~ 126 | 0 ~ 62 | 旧版本Genome Analyzer |
| Solexa | 59 ~ 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 | 流动槽ID | 136 |
| LANE | 泳道编号 | 2 |
| TILE | tile编号 | 2104 |
| X:Y | 簇在tile内的坐标 | 15343:197393 |
| READ | read编号(1或2) | 1 |
| ISFILTERED | 是否通过质控(Y/N) | Y |
| CONTROLBITS | 控制位 | 18 |
| INDEX | Index序列 | 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记录从标识行到质量行的完整结构,以及各个字段的含义。
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格式看起来简单,但实际操作中编码混淆、长度错位、标识行歧义都是常见坑。把基础打牢,后面的质控、比对、变异检测才能站得稳。