使用GATK4的AddOrReplaceReadgroups时RGSM参数遭拒问题
GATK4 AddOrReplaceReadgroups 批量运行报错排查与解决
问题场景
通过循环脚本读取384行制表符分隔文件plate1_rg_fields.txt,批量为BAM文件添加读组信息时,出现以下问题:
- 单独运行第一行样本无异常
- 批量运行时报错:
RGSM参数'1'不符合SAM头标签的正则表达式'^[ -~]+$' - 日志显示参数读取正确,但无输出文件生成
排查方向与解决方法
1. 清理制表符文件的隐藏字符
批量运行时,后续行的RGSM字段可能携带不可见控制字符(如Windows回车符^M、非打印ASCII字符),这些字符肉眼不可见但会触发正则校验失败。
- 操作步骤:
- 用
cat -A plate1_rg_fields.txt查看文件,检查每行末尾或字段间是否有异常字符 - 转换为Unix格式清除Windows回车:
dos2unix plate1_rg_fields.txt - 直接清除所有非打印字符:
sed 's/[^ -~]//g' plate1_rg_fields.txt > cleaned_plate1_rg_fields.txt,用清理后的文件重新运行
- 用
2. 修复循环脚本的字段分割逻辑
如果用read命令读取行内容,默认分隔符包含空格,可能导致制表符分割的字段错位,把其他字段内容误传给RGSM参数。
- 操作步骤:
- 在脚本开头添加
IFS=$'\t',强制以制表符作为字段分隔符 - 或改用
awk处理循环,避免分割错误,示例脚本:awk -F'\t' '{ input_bam=$1 rgsm=$2 rglb=$3 rgpl=$4 rgpu=$5 output_bam=input_bam".rg.bam" system("gatk AddOrReplaceReadGroups -I " input_bam " -O " output_bam " -RGSM " rgsm " -RGLB " rglb " -RGPL " rgpl " -RGPU " rgpu) }' plate1_rg_fields.txt
- 在脚本开头添加
3. 规范参数的引号包裹
当RGSM值为数字时,若未用引号包裹,可能被Shell解析为特殊值,导致参数传递异常。
- 操作步骤:
- 给所有GATK命令的参数加上双引号,示例:
gatk AddOrReplaceReadGroups -I "$input_bam" -O "$output_bam" -RGSM "$rgsm" -RGLB "$rglb" -RGPL "$rgpl" -RGPU "$rgpu"
- 给所有GATK命令的参数加上双引号,示例:
4. 排查循环变量的重置逻辑
若循环中变量未正确重置,可能导致上一行的错误值被继承,或空变量被Shell解析为异常内容。
- 操作步骤:
- 在循环内部开头添加变量重置语句:
input_bam="" rgsm="" rglb="" rgpl="" rgpu="" - 添加日志打印,记录每一行的参数值:
通过日志定位具体出错的行,单独测试该行的命令echo "Processing: $input_bam, RGSM: '$rgsm'" >> batch_run.log
- 在循环内部开头添加变量重置语句:
验证技巧
- 提取报错行的内容,单独执行GATK命令,确认是否复现错误
- 用
echo "$rgsm" | od -c查看RGSM变量的字符编码,排查隐藏字符
内容的提问来源于stack exchange,提问作者Cora_olpe
相关产品推荐
相关产品推荐

