ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Fastp做FASTQ质控:从参数拆解到Shell批量处理实战

Fastp做FASTQ质控:从参数拆解到Shell批量处理实战 1. 为什么我最终选择了Fastp做FASTQ质控测序数据下机之后第一件事就是质控。这个环节看起来简单但真正做过的人都知道它直接决定了后续比对、组装、变异检测的成败。我刚开始接触FASTQ数据处理的时候用的是FastQC加Trimmomatic的组合流程跑得通但总感觉不够利索——FastQC只负责看Trimmomatic负责切中间还得手动判断质量阈值样本一多就特别费劲。后来换到Fastp之后整个体验完全不一样了。Fastp把质控和过滤合在了一起一次运行就能完成质量评估、接头去除、低质量碱基修剪、长度过滤、polyG尾处理等操作而且速度非常快官方给出的数据是多线程下处理一千万条reads只需要几分钟。对于动辄几十个GB的FASTQ文件来说这个效率提升是实打实的。这篇文章主要面向三类人一是刚接触测序数据分析、对FASTQ格式还不太熟悉的新手二是已经在用Fastp但想深入了解参数细节和踩坑经验的朋友三是需要把Fastp集成到自动化流程里、用Shell脚本批量处理样本的从业者。我会从FASTQ的基本结构讲起然后拆解Fastp的核心参数和背后的设计逻辑再给出完整的实操流程和Shell批量处理方案最后把我自己踩过的坑和排查经验整理出来。核心关键词Fastp、FASTQ、质控、UMI、Shell。这些词会贯穿全文不管你是做转录组、全基因组还是扩增子测序只要涉及FASTQ数据的预处理这篇内容都能直接拿来参考。2. FASTQ文件到底长什么样为什么质控绕不开它2.1 FASTQ的四行结构拆解很多人拿到FASTQ文件第一反应是“怎么打开”。其实FASTQ本质上就是一个纯文本文件用less、head、zcat这些命令就能直接查看。它的每一條read由四行组成SRR1234567.1 1 length150 GATCGGAAGAGCACACGTCTGAACTCCAGTCACATCACGATCTCGTATGCCGTCTTCTGCTTG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII第一行以开头是read的标识符和可选描述信息第二行是碱基序列由A、T、C、G、N组成第三行以开头通常重复第一行的标识符也可以省略第四行是质量值字符串每个字符对应第二行一个碱基的质量分数。质量值的编码方式常见的有Phred33Sanger、Illumina 1.8和Phred64早期Illumina 1.3-1.7。现在绝大多数平台都是Phred33字符!对应Q0I对应Q40。Fastp默认按Phred33处理如果你的数据是旧平台产出的Phred64需要加--phred64参数否则质量评估会完全错位。2.2 质控到底在控什么质控不是简单地“把差的reads扔掉”它要解决的是测序过程中引入的各种系统性和随机性误差。具体来说FASTQ数据里常见的问题包括接头污染文库构建时接头没有完全去除读长超过插入片段长度时read的3端会测到接头序列。接头如果不切除比对时会产生大量软剪切或错误比对。低质量碱基测序仪在读取后期信号衰减质量值下降尤其是read的3端。低质量碱基会导致错误比对和假阳性变异。N碱基测序仪无法识别某个碱基时输出N比例过高说明测序质量有问题。polyG尾在NextSeq/NovaSeq等双色荧光平台上无信号时容易产生连续的G碱基这是平台特有的伪影。长度不均原始数据中可能混有长度过短的read这些read比对唯一性差容易造成多重比对。UMI序列如果文库构建时加了UMIUnique Molecular IdentifierUMI需要从read中提取出来并记录否则会干扰比对也失去了去重的意义。Fastp的设计思路就是把这些步骤全部串起来在一次扫描中完成所有处理避免多次读写文件带来的I/O开销。2.3 Fastp相比传统方案的优势在哪我用过FastQCTrimmomatic、CutadaptFastQC、以及Fastp三套方案实测下来Fastp的优势集中在几个方面对比维度FastQCTrimmomaticCutadaptFastQCFastp运行速度中等较慢快多线程优化接头检测需手动指定需手动指定自动检测报告生成需单独运行FastQC需单独运行FastQC内置HTML报告UMI处理不支持部分支持原生支持polyG处理需额外配置不支持自动检测去重功能不支持不支持支持内存占用中等较高低Fastp的自动接头检测是我最喜欢的功能之一。它会通过overlap分析自动识别接头序列不需要你提前知道接头是什么。对于不确定文库类型或者接头信息的场景这个功能省了很多事。3. Fastp核心参数逐个拆解与选型逻辑3.1 输入输出与基本运行模式Fastp最基本的用法是fastp -i sample_R1.fastq.gz -I sample_R2.fastq.gz \ -o sample_R1.clean.fastq.gz -O sample_R2.clean.fastq.gz-i和-I分别指定双端测序的R1和R2输入文件-o和-O指定输出文件。如果是单端数据只用-i和-o即可。Fastp支持gzip压缩格式的输入输出不需要额外解压这一点在处理大规模数据时非常关键——解压再压缩的I/O开销往往比质控本身还大。--thread参数控制线程数默认是3。我一般会根据服务器核数设置到8到16再高的话收益递减因为Fastp的主要瓶颈在I/O而不是CPU。实测在SSD存储上16线程处理一个5GB的gzip压缩FASTQ文件大约需要2到3分钟。3.2 质量过滤参数的选择依据质量过滤涉及几个核心参数-q/--qualified_quality_phred合格碱基的质量阈值默认Q15。低于这个值的碱基会被认为是低质量碱基。-u/--unqualified_percent_limit一条read中低质量碱基的比例上限默认40%。超过这个比例的read会被整条丢弃。-n/--n_base_limit一条read中N碱基的数量上限默认5。超过则丢弃整条read。-l/--length_required最短read长度默认15bp。短于这个长度的read会被丢弃。这些默认值是怎么来的Q15对应的错误率大约是3%对于大多数应用来说是可以接受的。40%的低质量碱基比例上限意味着如果一条read有将近一半的碱基质量低于Q15这条read的可靠性就很差了。N碱基上限设为5是因为少量N可以通过比对工具处理但过多N说明测序信号严重丢失。我自己的经验是对于全基因组重测序数据可以把-q提高到Q20-u降到30%这样得到的clean data质量更高比对率通常能提升1到2个百分点。但对于一些低起始量的RNA-seq或者古DNA样本质量本身就不高这时候如果卡得太严会损失大量数据反而影响后续分析。所以参数没有绝对的最优值要根据样本类型和下游分析需求来定。3.3 接头处理与polyG修剪接头处理有两个参数值得关注--detect_adapter_for_pe对双端数据启用接头自动检测。Fastp默认对单端数据启用自动检测双端数据需要显式开启。-a/--adapter_sequence手动指定接头序列。如果你明确知道接头是什么直接指定比自动检测更准确。--adapter_sequence_r2R2的接头序列如果R1和R2接头不同则需要分别指定。polyG修剪通过-g/--trim_poly_g开启Fastp会自动检测polyG并修剪。对于NextSeq/NovaSeq数据我建议默认开启这个选项。--poly_g_min_len控制polyG的最小长度默认10bp一般不需要改。还有一个相关的参数是-x/--trim_poly_x用于修剪polyX尾不限于G但这个功能默认关闭因为polyX修剪有可能会误伤真实的polyA尾巴比如真核生物的mRNA polyA。除非你明确知道数据中有polyX污染否则不建议开启。3.4 UMI处理的关键配置UMIUnique Molecular Identifier是一段随机序列在文库构建时加到每个DNA分子上用于后续去重和定量。Fastp对UMI的支持主要通过以下几个参数-U/--umi启用UMI处理。--umi_locUMI的位置可选index1、index2、read1、read2、per_index、per_read。--umi_lenUMI的长度默认0自动检测。--umi_prefixUMI在read名称中的前缀默认是UMI。--umi_skipUMI后面需要跳过的碱基数。最常见的场景是UMI位于read1的5端长度为8bp。配置如下fastp -i sample_R1.fastq.gz -I sample_R2.fastq.gz \ -o sample_R1.clean.fastq.gz -O sample_R2.clean.fastq.gz \ -U --umi_locread1 --umi_len8Fastp会把UMI序列提取出来添加到read名称中格式类似UMI_ACGTACGT:原始read名。后续去重工具比如umi_tools可以直接从read名称中解析UMI。这里有个容易踩的坑--umi_skip参数。有些文库设计是UMI后面还有几个固定碱基比如细胞条形码这时候需要设置--umi_skip来跳过这些碱基。如果不设置UMI提取会错位后续去重全部失效。我在一个单细胞项目里就遇到过这个问题当时UMI后面有12bp的细胞条形码没有设置skip结果去重后细胞数少了一半。3.5 去重功能的适用场景Fastp内置了去重功能通过-D/--dedup开启。它的原理是基于序列完全匹配的去重对于PCR扩增产生的重复片段有很好的去除效果。但要注意Fastp的去重是基于序列相同的去重不是基于UMI的去重。如果你有UMI应该用umi_tools等专门工具做UMI去重而不是用Fastp的--dedup。两者混用可能会导致数据损失过多。另外--dedup会消耗额外的内存来存储序列指纹对于大规模数据比如超过1亿条read内存占用可能达到几十GB。如果服务器内存有限建议先评估一下数据量再决定是否开启。4. 完整实操流程从原始数据到clean data4.1 环境准备与安装Fastp的安装非常简单推荐用condaconda create -n fastp_env python3.9 conda activate fastp_env conda install -c bioconda fastp安装完成后用fastp --version确认版本。我写这篇文章时最新稳定版是0.23.4建议用0.23以上的版本因为早期版本在UMI处理和polyG检测上有一些已知问题。如果你不想用conda也可以直接从GitHub下载预编译的二进制文件解压后放到PATH里就能用。Fastp是C写的没有复杂的依赖静态编译的版本基本可以在任何Linux发行版上直接运行。4.2 单样本质控的完整命令下面是我处理双端RNA-seq数据时常用的命令模板fastp \ -i raw/SAMPLE_R1.fastq.gz \ -I raw/SAMPLE_R2.fastq.gz \ -o clean/SAMPLE_R1.clean.fastq.gz \ -O clean/SAMPLE_R2.clean.fastq.gz \ --detect_adapter_for_pe \ --trim_poly_g \ -q 20 \ -u 30 \ -n 3 \ -l 36 \ --thread 12 \ -j reports/SAMPLE.fastp.json \ -h reports/SAMPLE.fastp.html \ -R reports/SAMPLE.fastp.title逐项说明--detect_adapter_for_pe双端数据启用接头自动检测。--trim_poly_g修剪polyG尾对NextSeq/NovaSeq数据必须开。-q 20质量阈值提高到Q20比默认的Q15更严格。-u 30低质量碱基比例上限降到30%。-n 3N碱基上限降到3。-l 36最短read长度设为36bp因为大多数比对工具对短于36bp的read比对效果很差。--thread 12使用12个线程。-j和-h分别输出JSON格式和HTML格式的报告。-R给报告加一个标题方便在浏览器里区分样本。4.3 用Shell脚本批量处理所有样本单个样本跑通了之后下一步就是用Shell脚本批量处理。假设你的原始数据放在raw/目录下文件名格式是SAMPLE_R1.fastq.gz和SAMPLE_R2.fastq.gz下面是一个实用的批量处理脚本#!/bin/bash # 配置路径 RAW_DIRraw CLEAN_DIRclean REPORT_DIRreports THREADS12 # 创建输出目录 mkdir -p ${CLEAN_DIR} ${REPORT_DIR} # 遍历所有R1文件 for R1 in ${RAW_DIR}/*_R1.fastq.gz; do # 提取样本名 SAMPLE$(basename ${R1} _R1.fastq.gz) R2${RAW_DIR}/${SAMPLE}_R2.fastq.gz # 检查R2是否存在 if [ ! -f ${R2} ]; then echo 警告${SAMPLE} 的R2文件不存在跳过 continue fi echo 正在处理样本${SAMPLE} fastp \ -i ${R1} \ -I ${R2} \ -o ${CLEAN_DIR}/${SAMPLE}_R1.clean.fastq.gz \ -O ${CLEAN_DIR}/${SAMPLE}_R2.clean.fastq.gz \ --detect_adapter_for_pe \ --trim_poly_g \ -q 20 -u 30 -n 3 -l 36 \ --thread ${THREADS} \ -j ${REPORT_DIR}/${SAMPLE}.fastp.json \ -h ${REPORT_DIR}/${SAMPLE}.fastp.html \ -R ${SAMPLE} fastp report \ 2 ${REPORT_DIR}/${SAMPLE}.fastp.log # 检查退出状态 if [ $? -eq 0 ]; then echo ${SAMPLE} 处理完成 else echo ${SAMPLE} 处理失败请检查日志 fi done echo 所有样本处理完毕这个脚本里有几个细节值得注意basename ${R1} _R1.fastq.gz用basename命令去掉路径和后缀提取纯样本名。这是Shell里处理文件名最简洁的方式。if [ ! -f ${R2} ]检查R2文件是否存在避免因为缺失文件导致Fastp报错中断整个循环。2 ${REPORT_DIR}/${SAMPLE}.fastp.log把标准错误重定向到日志文件方便排查问题。Fastp的运行信息主要输出到stderr。$?检查上一条命令的退出状态0表示成功非0表示失败。如果你想让多个样本并行处理可以用把Fastp放到后台然后用wait等待所有任务完成。但要注意控制并发数不要超过服务器的CPU核数和内存上限。我一般用xargs -P来控制并发ls raw/*_R1.fastq.gz | sed s/_R1.fastq.gz// | \ xargs -P 4 -I {} bash -c SAMPLE$(basename {}) fastp -i raw/${SAMPLE}_R1.fastq.gz -I raw/${SAMPLE}_R2.fastq.gz \ -o clean/${SAMPLE}_R1.clean.fastq.gz -O clean/${SAMPLE}_R2.clean.fastq.gz \ --detect_adapter_for_pe --trim_poly_g -q 20 -u 30 -n 3 -l 36 \ --thread 6 -j reports/${SAMPLE}.fastp.json -h reports/${SAMPLE}.fastp.html -P 4表示同时处理4个样本每个样本用6个线程总共24个线程。这个配置在32核的服务器上跑起来很稳。4.4 报告解读哪些指标需要重点关注Fastp的HTML报告非常直观但有几个关键指标需要特别留意Before filtering的Q30比例Q30表示质量值大于等于30的碱基比例是衡量测序质量的核心指标。Illumina平台一般要求Q30在80%以上如果低于70%说明这批数据质量堪忧可能需要考虑重新测序。Adapter content接头含量。如果原始数据中接头含量超过5%说明文库构建时接头去除不彻底Fastp的自动检测和修剪就非常必要。Duplication rate重复率。对于全基因组测序重复率通常在5%到20%之间对于RNA-seq重复率可能更高因为高表达基因的转录本本身就多。如果重复率异常高比如超过50%可能是PCR循环数过多或者起始量太低。Insert size estimation插入片段大小估计。这个指标对双端数据很重要如果插入片段太小比如小于read长度的两倍两条read会有大量重叠接头也更容易被测到。After filtering的read数量过滤后保留的read比例。一般来说保留70%到90%是正常的。如果保留比例低于50%说明过滤条件太严格或者原始数据质量太差需要调整参数。5. 常见问题与排查技巧实录5.1 Fastp运行报错“can not find adapter”怎么办这个报错通常出现在双端数据没有开启--detect_adapter_for_pe的时候。Fastp对单端数据默认开启接头检测但双端数据需要显式指定。加上这个参数一般就能解决。如果加了参数还是报错可能是数据中确实没有接头污染Fastp检测不到。这时候可以忽略这个警告或者手动指定接头序列。常见的Illumina TruSeq接头序列是AGATCGGAAGAGCACACGTCTGAACTCCAGTCAR1和AGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGTR2。5.2 处理速度突然变慢是什么原因Fastp的速度主要受三个因素影响输入文件大小、线程数、磁盘I/O。如果你发现处理速度比平时慢很多按以下顺序排查检查磁盘空间输出目录所在磁盘满了会导致写入阻塞。用df -h查看。检查内存使用如果开启了--dedup内存占用会随read数量线性增长。用free -h查看内存是否吃紧。检查线程竞争如果同时跑了多个Fastp实例线程总数超过CPU核数会导致频繁上下文切换。用top或htop查看CPU使用率。检查输入文件完整性gzip文件损坏会导致读取异常缓慢。用gzip -t测试文件完整性。5.3 UMI提取后read名称变了下游工具不识别怎么办Fastp默认把UMI添加到read名称的符号之后格式是UMI_ACGTACGT:原始名称。但有些下游工具比如某些比对软件对read名称格式有要求可能不识别这种格式。解决办法是用--umi_prefix自定义前缀或者用--umi_skip调整UMI位置。如果下游工具完全不支持UMI名称可以考虑用--umi_locper_read把UMI信息放到read名称的末尾或者干脆在比对后再用umi_tools从fastq中提取UMI。5.4 过滤后数据量损失太大怎么调整如果clean data保留比例低于60%说明过滤条件太严格。按以下优先级调整参数默认值调整建议影响-q15降到10保留更多低质量read-u40提高到50允许更多低质量碱基-l15降到20保留更短的read-n5提高到10允许更多N碱基--trim_poly_g关闭关闭避免过度修剪但要注意放宽条件虽然能保留更多数据但clean data的质量会下降可能影响下游比对和变异检测的准确性。我的建议是先用默认参数跑一遍看看报告里的各项指标再针对性地调整。5.5 常见问题速查表问题现象可能原因解决方法报错“can not find adapter”双端数据未开启接头检测加--detect_adapter_for_pe运行速度异常慢磁盘满/内存不足/线程竞争检查df -h、free -h、topUMI提取错位--umi_skip未设置根据文库设计设置skip值数据损失过大过滤条件太严格放宽-q、-u、-l报告显示接头含量高文库接头去除不彻底开启自动检测或手动指定接头polyG修剪过度--poly_g_min_len太小提高到15或20去重后数据量骤降重复率本身很高检查PCR循环数考虑不用--dedup输出文件为空输入文件路径错误或损坏用gzip -t测试检查路径5.6 几个我踩过的坑第一个坑忘记加--detect_adapter_for_pe。刚开始用Fastp的时候我处理双端数据没有加这个参数结果接头完全没有被修剪。后来看报告才发现接头含量还有8%以上。加上参数后接头含量降到了0.1%以下。第二个坑UMI的--umi_skip设置错误。在一个单细胞项目里UMI后面有12bp的细胞条形码我一开始没有设置--umi_skip12导致UMI提取时把细胞条形码的前8bp当成了UMI。结果去重后细胞数只有预期的一半。后来加上skip参数细胞数恢复正常。第三个坑--dedup导致内存溢出。有一次处理一个超大样本超过2亿条read开启了--dedup结果服务器内存被吃满进程被系统kill掉。后来查文档才知道--dedup需要存储所有read的指纹内存占用大约是read数量的几十倍。对于超大样本要么增加内存要么关闭去重。第四个坑Shell脚本里变量没加引号。在批量处理脚本里如果样本名包含空格或特殊字符不加引号会导致路径解析错误。比如${SAMPLE}如果包含空格fastp -i ${R1}会被解析成多个参数。解决办法是给所有变量加双引号${R1}。第五个坑输出目录不存在。Fastp不会自动创建输出目录如果clean/目录不存在会直接报错。在脚本开头加mkdir -p创建目录就能避免这个问题。6. 进阶技巧把Fastp集成到自动化流程里6.1 用Snakemake或Nextflow编排如果你经常需要处理大批量样本手动写Shell脚本虽然可行但维护起来比较麻烦。用Snakemake或Nextflow可以把Fastp集成到工作流里自动处理依赖关系和并行调度。以Snakemake为例一个简单的规则可以这样写rule fastp: input: r1raw/{sample}_R1.fastq.gz, r2raw/{sample}_R2.fastq.gz output: r1clean/{sample}_R1.clean.fastq.gz, r2clean/{sample}_R2.clean.fastq.gz, htmlreports/{sample}.fastp.html, jsonreports/{sample}.fastp.json threads: 12 shell: fastp -i {input.r1} -I {input.r2} \ -o {output.r1} -O {output.r2} \ --detect_adapter_for_pe --trim_poly_g \ -q 20 -u 30 -n 3 -l 36 \ --thread {threads} \ -j {output.json} -h {output.html} Snakemake会自动根据{sample}通配符匹配所有样本并根据threads配置并行调度。你只需要在命令行指定--cores 48Snakemake就会自动分配资源。6.2 质控前后的数据对比方法质控做完了怎么证明质控有效我一般会从几个维度做对比比对率用Bowtie2或BWA把质控前后的数据分别比对到参考基因组比较比对率。质控后的比对率通常能提升2到5个百分点。重复率用FastQC或Picard的MarkDuplicates比较质控前后的重复率。如果接头和低质量碱基被正确修剪重复率通常会下降。变异检测灵敏度如果有已知的真阳性变异位点可以比较质控前后这些位点的检出情况。质控后的假阳性通常会减少。覆盖度均一性对于全基因组数据质控后的覆盖度均一性通常更好尤其是在高GC区域。6.3 参数调优的经验法则经过多个项目的积累我总结了一套参数调优的经验法则全基因组重测序-q 20 -u 30 -n 3 -l 36开启--detect_adapter_for_pe和--trim_poly_g不开--dedup因为PCR重复少去重收益不大。RNA-seq-q 15 -u 40 -n 5 -l 36开启--detect_adapter_for_pe和--trim_poly_g不开--dedup因为高表达基因的重复是真实的生物学重复。扩增子测序-q 20 -u 30 -n 3 -l 100开启--detect_adapter_for_pe不开--trim_poly_g扩增子通常不是双色平台不开--dedup。单细胞RNA-seq-q 20 -u 30 -n 3 -l 36开启--detect_adapter_for_pe和--trim_poly_g配置UMI参数不开--dedupUMI去重由umi_tools处理。古DNA-q 10 -u 50 -n 10 -l 30开启--detect_adapter_for_pe不开--trim_poly_g不开--dedup古DNA本身就有大量损伤和短片段过滤太严会损失数据。这些参数不是绝对的具体还要根据数据质量和下游分析需求来调整。我的建议是先用默认参数跑一遍看看报告再针对性地优化。6.4 如何用Shell脚本监控质控进度批量处理几十个样本的时候你肯定想知道哪些跑完了、哪些还在跑。我一般会在脚本里加一个简单的进度输出TOTAL$(ls raw/*_R1.fastq.gz | wc -l) COUNT0 for R1 in raw/*_R1.fastq.gz; do COUNT$((COUNT 1)) SAMPLE$(basename ${R1} _R1.fastq.gz) echo [${COUNT}/${TOTAL}] 正在处理 ${SAMPLE} ... # ... fastp 命令 ... echo [${COUNT}/${TOTAL}] ${SAMPLE} 完成 done这样每处理一个样本就会输出进度心里有数。如果样本特别多还可以把日志写到文件里用tail -f实时查看。6.5 质控后的数据管理建议质控完成后clean data的命名和管理也很重要。我习惯用这样的目录结构project/ ├── raw/ # 原始数据只读 │ ├── SAMPLE1_R1.fastq.gz │ └── SAMPLE1_R2.fastq.gz ├── clean/ # 质控后数据 │ ├── SAMPLE1_R1.clean.fastq.gz │ └── SAMPLE1_R2.clean.fastq.gz ├── reports/ # 质控报告 │ ├── SAMPLE1.fastp.html │ └── SAMPLE1.fastp.json ├── logs/ # 运行日志 │ └── SAMPLE1.fastp.log └── scripts/ # 分析脚本 └── run_fastp.sh原始数据永远不要覆盖或修改所有处理都在clean目录下进行。报告和日志分开存放方便回溯和排查问题。脚本单独放在scripts目录用git做版本管理这样每次参数调整都有记录。7. 关于Fastp和FASTQ质控的一些个人体会Fastp这个工具我用了快三年从0.20版本用到现在的0.23版本眼看着它从一个单纯的质控工具变成了一个功能全面的FASTQ预处理平台。它的自动接头检测、polyG修剪、UMI处理这些功能确实解决了很多实际问题。但工具再好也只是工具。质控的核心不是把参数调得多完美而是理解你的数据、理解你的下游分析需要什么。我见过有人把-q设到30结果clean data只剩30%然后抱怨Fastp不好用。也见过有人完全用默认参数跑出来的数据比对率也很高。关键是要看报告、看指标、看下游结果而不是盲目追求“最严格”的参数。UMI处理是Fastp的一个亮点但也是最容易出问题的地方。如果你的文库有UMI一定要先搞清楚UMI的位置、长度、后面有没有需要跳过的碱基。这些信息搞错了后续去重全白费。我建议在正式处理之前先用head或zcat看几条原始read确认UMI的结构再配置参数。Shell脚本批量处理是提高效率的必经之路。但脚本写多了就会发现变量引号、路径拼接、错误处理这些细节特别容易出问题。我的经验是所有变量都加双引号所有路径都用绝对路径所有命令都检查退出状态。这三条做到了脚本的稳定性会好很多。最后再分享一个小技巧Fastp的JSON报告可以用jq命令解析提取关键指标做汇总。比如jq .summary.after_filtering.total_reads, .summary.after_filtering.q30_rate reports/SAMPLE.fastp.json这样可以把所有样本的质控指标汇总到一个表格里方便比较和筛选。对于几十个样本的项目这个技巧能省不少时间。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进