Nextflow运行Combinevcf进程报No such variable: prefix错误
报错原因
找不到prefix变量是Nextflow双引号脚本块的变量解析规则导致的:
- 进程脚本用
"""(三双引号)包裹时,Nextflow会优先解析块内所有${var}格式的内容,将其识别为流程全局/通道层面的Nextflow变量 - 你定义的
prefix、prefix1是shell运行时的bash局部变量,不属于Nextflow的变量作用域,且后续引用这两个变量时没有对$符号做转义,Nextflow在流程预处理阶段找不到对应名称的Nextflow变量,就会直接抛出变量不存在的错误 - 代码里还有一个隐藏bug:
tr -s ‘[:blank:]’ ‘,’使用了中文全角单引号,即使修复变量问题,这行命令也会因为字符非法执行失败。
修复方法
- 参照前两个正常运行的Annovar进程的写法,所有shell内部定义的
prefix、prefix1变量引用前,都给$加反斜杠转义,写成\${prefix}、\${prefix1},告诉Nextflow这部分是shell变量,不需要提前解析 - 将tr命令里的中文全角单引号替换为英文半角单引号
修复后的Combinevcf进程代码如下:
process Combinevcf { publishDir "${params.output}/combinevcf", mode: 'copy' input: path 'genebased' from end.flatMap() path 'allbased' from end1.flatMap() output: path "*_3.csv" into end3 """ prefix=\$(basename \$(readlink genebased) .exonic_variant_function) prefix1=\$(basename \$(readlink allbased) .csv) cat \${prefix}.exonic_variant_function | tr -s '[:blank:]' ',' | awk 'BEGIN{FS=",";OFS="," }{ print \$3,\$13,\$22}' | awk ' BEGIN { OFS=", "; print "refGene", "refGene", "refGene", "refGene", "refGene", "Zogysity","chr", "filter" } { print \$0, "" } ' > \${prefix}_1.csv awk 'BEGIN{FS=",";OFS="," }{ print \$1,\$2,\$3,\$4,\$5,\$6,\$7,\$8,\$9,\$10,\$15,\$21,\$24,\$25}' \${prefix1}.csv > \${prefix1}_2.csv paste \${prefix}_1.csv \${prefix1}_2.csv > \${prefix}_3.csv """ }
注意事项
- Nextflow双引号脚本块的变量引用规则可以记成:流程定义的参数、通道传入的Nextflow变量直接用
${var}引用;shell脚本内部定义的bash局部变量,必须用\${var}转义后引用 - 如果是批量处理多个样本,当前两个输入通道独立拉取文件的写法可能出现不同样本的注释文件错配,建议在通道输出阶段就绑定样本ID,传入Combinevcf时按样本ID一一匹配,避免结果错乱。
内容的提问来源于stack exchange,提问作者Daffy
相关产品推荐
相关产品推荐

