第三章 运行FastQC:命令行与参数详解

上一章我们聊了为什么要做质控。现在,咱们直接上手——怎么把FastQC跑起来。

你有没有遇到过这种情况?花了半天学了一堆参数,结果跑出来的结果跟你想象的不一样。说实话,FastQC的命令行其实不复杂,但有几个参数,我敢说大多数新手都会踩坑。

这一章,我会把每个常用参数讲透。哪些是必须的,哪些是锦上添花,哪些是你压根不需要碰的,一一说清楚。

基础用法:三秒钟跑起来

FastQC的基本命令,简单到让你怀疑人生:

fastqc sample.fastq.gz

这样一行,就能在当前目录生成一个HTML报告和一个ZIP压缩包。没错,就这么简单。

但说实话,实际项目中你不会只跑一个文件。一个标准的RNA-seq项目,少说也有几十个样本。我一个一个敲?别开玩笑了。

批量处理才是常态:

fastqc sample1.fastq.gz sample2.fastq.gz sample3.fastq.gz

或者用更优雅的方式:

fastqc *.fastq.gz

我个人习惯这样写。简单、清晰,一跑起来所有样本就一起出报告了。

关键参数详解:这些你得搞清楚

FastQC的参数不算多,但有几个非常关键。我用一个表格把它们列出来,这样你一眼就能看明白:

参数 作用 默认值 我推荐的值
--threads 指定线程数,加速分析 1 根据CPU核数,一般4-8
--outdir 指定输出目录 当前目录 建议单独建一个qc目录
--extract 解压ZIP报告 不自动解压 建议加上
--noextract 不解压ZIP报告 默认的行为 硬盘空间紧张时使用
--casava 兼容CASAVA 1.8格式 不启用 看你的数据来源
--nano 处理ONT纳米孔数据 不启用 长读长数据必须加
--adapters 指定接头序列文件 内置常见接头 非标准测序时使用

--threads:跑得快的关键

这个参数很实用。我习惯把它设为CPU核数的一半:

fastqc sample.fastq.gz --threads 4

为什么是一半?因为FastQC的线程是用于解压和读取的。我是这么试出来的。设多了反而会变慢,因为硬盘读写成了瓶颈。你想想看,硬盘都忙不过来了,CPU再多也是白搭。

对于大型FASTQ文件——比如10GB以上的,我建议:

  • 服务器上:设8个线程
  • 笔记本上:设4个线程就够了
  • 如果文件很多:可以并行跑多个FastQC进程

--outdir:管理输出文件的习惯

我在项目里养成了一个习惯:所有质控报告都放在一个qc目录下。这样数据一整理就很清爽:

fastqc *.fastq.gz --outdir ./qc_reports

这样跑完后,所有的HTML和ZIP文件都会乖乖待在那个文件夹里。避免了到处散落文件的混乱局面。

--extract vs --noextract:解压是个大问题

说实话,这个问题我踩过坑。有一次我跑完FastQC,想要写脚本批量解析结果——结果发现数据全在ZIP里,还得一个一个解压。

所以我现在习惯加上--extract:

fastqc sample.fastq.gz --extract

这样就会自动解压,得到一个目录。里面包含所有原始数据文件,方便后续用脚本提取。

但如果你只是看一眼报告,不需要再处理数据,那就不加这个参数。ZIP文件还能省点空间。

--casava:兼容旧格式的数据

这个参数针对的是Illumina CASAVA 1.8及之前的格式。现在的新数据大多不需要。但如果你是从一些旧项目拿到的数据,或者用了特定的碱基识别软件,可能会遇到。

加了它之后,FastQC会从文件名中提取样本名和run信息。我一般不用。但如果你的文件名格式是:

SampleName_S1_L001_R1_001.fastq.gz

那可以考虑加上。不过说实话,不加也没关系,报告照样能出。

--nano:处理纳米孔数据的必备选项

这个参数是后来加的。如果你做的是纳米孔测序,比如ONT的数据,那就得加上:

fastqc sample.fastq.gz --nano

为什么?因为纳米孔数据的read长度、质量分布跟Illumina完全不同。不加这个参数,FastQC会按短读长的逻辑去分析,结果里会出现很多奇怪的报警。我曾经因为没加这个参数,被错误的质量警告吓得不轻,差点以为测序出了问题。

实用场景示例

说了这么多,给你几个我实际项目中常用的命令组合:

场景一:常规Illumina双端测序,批量处理

fastqc *_R1_*.fastq.gz *_R2_*.fastq.gz \
  --threads 8 \
  --outdir ./qc_reports \
  --extract

场景二:单端RNA-seq,文件较多

for f in *.fastq.gz; do
  fastqc "$f" \
    --threads 4 \
    --outdir ./qc_reports
done

场景三:ONT纳米孔数据

fastqc *.fastq.gz \
  --nano \
  --threads 4 \
  --outdir ./nano_qc \
  --extract

输出文件解析

跑完后的输出,你会在指定目录看到两类文件:

  • .html文件:可直接用浏览器打开的交互式报告
  • .zip文件:包含原始数据,适合用脚本批量解析

如果加了--extract,还会多出一个目录,里面包含:

  • fastqc_data.txt:所有质量数据的汇总
  • fastqc_report.html:单独的HTML报告
  • summary.txt:简洁的通过/警告/失败状态
  • Icons/:报告中的状态图标

用一张图看清整体流程

下面这张图展示了从拿到FASTQ文件到输出质控报告的完整路径:

FastQC 命令行工作流向图 FastQC 命令行工作流向图 FASTQ 文件 sample.fastq.gz 命令行参数 --threads --outdir --extract FastQC 执行引擎 分析质量指标 是否加 --extract ? (决定输出形式) 加 --extract 自动解压 ZIP 目录 不加 --extract 保留 ZIP 压缩包 建议:默认加 --extract,方便脚本批量提取数据;硬盘紧张时可用 --noextract

避坑指南:常见错误

错误一:路径里有空格

我曾经因为文件名里有空格,结果FastQC报了一堆错。比如:

# 错误写法
fastqc sample 1.fastq.gz

正确做法是加引号:

fastqc "sample 1.fastq.gz"
技巧一:用通配符少输很多字

.fastq.gz 和 .fq.gz 都支持。写 for 循环批量跑也很方便:

for file in *.fq.gz; do fastqc "$file" --outdir ./qc; done
错误二:输入文件格式不对

FastQC只接受FASTQ格式。如果你给了FASTA或者SAM格式,它会直接报错。先用file命令确认一下:

file sample.fastq.gz

如果显示的是"ASCII text",那就搞错了。应该是"gzip compressed data"。

版本差异:不同的FastQC不一样

这一点得注意。不同版本的FastQC,参数可能有些变化。比如0.11.9版本之后改了一些输出格式。我建议用最新版。

查看版本:

fastqc --version

如果你想看完整参数列表,直接:

fastqc --help

会输出一长串说明。别被吓到,常用的就那几个参数。

小结:两个原则

嗯,这一章的核心内容就这些。总结一下:

  • 原则一:批量跑就用通配符配合outdir
  • 原则二:看情况决定是否要解压

我个人常用的「标准配置」长这样:

fastqc *.fastq.gz \
  --threads $(nproc) \
  --outdir ./qc_reports \
  --extract

把$(nproc)换成你喜欢的线程数就行。这样一套组合拳下来,结果整齐又易管理。