BWA-mem与sambamba比对时read group报错及SAMPLE变量定义问题
报错原因与修复方案
你遇到的[E::bwa_set_rg] the read group line is not started with @RG报错,核心原因是对bwa mem -R参数的作用存在认知偏差:
-R参数的作用是写入符合SAM/BAM格式标准的@RG头信息,这是行业通用格式强制要求的,所有NGS分析工具(包括bwa、sambamba、GATK等)都只认@RG开头的RG行,不存在“配置工具识别@S开头read group”的选项——你看到的MGI测序read名里的@S200031047L1C001R002xxxx/1是read ID的前缀,属于序列名称的一部分,和SAM头里的Read Group元信息完全是两个东西。- 你当前传入的
-R '\@S200031047L1C001R002\S*[1-2]'既不符合@RG开头的格式要求,还错误写入了正则表达式:-R参数是直接接收字符串写入BAM头,不会做任何正则匹配,bwa检测到传入内容不符合格式就直接抛出错误。
正确的-R参数写法需要用制表符\t分隔必填字段,MGI平台测序数据的参考写法如下:
-R '@RG\tID:S200031047L1C001R002\tSM:对应样本名\tPL:MGI\tLB:对应文库名'
字段说明:
ID:read group唯一标识,可以直接填你MGI测序的lane/flowcell编号(就是你之前写的S开头的那串标识)SM:样本编号,是后续所有分析(变异检测、定量、去冗余等)识别样本的核心字段PL:测序平台,填MGI即可LB:文库编号,单样本单文库可以直接和样本名保持一致,多样本文库需填写唯一标识
另外你原始read名末尾的/1、/2是双端测序的read1/read2标记,bwa会自动识别,不需要额外在参数里写正则匹配。
${SAMPLE}变量配置方案 ${SAMPLE}是shell脚本的自定义变量,作用是批量运行时自动替换为对应样本名,避免逐样本修改命令,常用两种配置方式:
- 单样本临时运行:执行命令前直接在shell中赋值即可,注意提前创建输出目录,否则sambamba会因路径不存在报错:
# 替换为你的实际样本名 SAMPLE=sample_01 mkdir -p host_removal/${SAMPLE} # 后续执行bwa+sambamba的整条管道命令即可
- 多样本批量运行:先把所有样本名整理为纯文本列表(命名为
sample_list.txt,每行一个样本名),通过while循环批量执行,参考脚本如下:
cat sample_list.txt | while read SAMPLE do # 为每个样本创建独立输出目录 mkdir -p host_removal/${SAMPLE} # 执行比对、排序流程,注意替换为你实际的fastq文件命名规则 bwa mem \ -K 100000000 -v 3 -t 6 -Y \ -R "@RG\tID:S200031047L1C001R002\tSM:${SAMPLE}\tPL:MGI\tLB:${SAMPLE}" \ /path/to/reference/GCF_009858895.2_ASM985889v3_genomic.fna \ /path/to/raw-fastq/${SAMPLE}_1.fq.gz \ /path/to/raw-fastq/${SAMPLE}_2.fq.gz | \ /path/to/genomics/sambamba-0.8.2 view -S -f bam /dev/stdin | \ /path/to/genomics/sambamba-0.8.2 sort -m 8G /dev/stdin --out host_removal/${SAMPLE}/${SAMPLE}.hybrid.sorted.bam done
额外注意事项
- 你原命令里fastq路径写的正则表达式
'S\S[^_]*_L01_[0-9]+-[0-9]+'不会被shell自动解析,bwa会直接报文件不存在,不要在路径里写正则,要么用通配符*匹配,要么通过变量拼接准确的文件路径。 sambamba sort默认分配的内存较小,处理大测序文件时容易崩溃,建议加-m参数指定可用内存(比如上面示例里的-m 8G,根据你服务器的实际内存配置调整即可)。
内容的提问来源于stack exchange,提问作者Gustavo de Miranda
相关产品推荐
相关产品推荐

