Nextflow报错Unexpected character: '"',求原因及替代实现方式
报错原因及解决方法
报错原因
- Script块语法混合错误:Nextflow的
script块中,你把Groovy循环逻辑和Bash命令直接混写,循环内的"echo $value > $suf"只是一个Groovy字符串,没有被正确输出为要执行的Bash命令,导致Nextflow解析器识别到非法的双引号语法。 - 正则分隔符错误:
key.split(".")中的.是正则表达式的通配符(匹配任意字符),不是字面意义的点号,会导致ref1和suf分割错误。
修正后的代码
process refs { output: path "fa", emit: fa path "sdf", emit: sdf path "chrsize", emit: chrsize path "non", emit: non path "dbsnp", emit:dbsnp path "pvcf", emit: pvcf script: def dblist = file("$baseDir/db/db.list") def cmds = [] dblist.text.eachLine { line -> def tokens = line.trim().split(/\s+/) def (key, value) = tokens def (ref1, suf) = key.split(/\\./) // 转义点号作为分隔符 if (ref1 == params.ref) { def full_path = "${baseDir}/db/${value}" cmds.add("echo ${full_path} > ${suf}") } } // 将收集的命令拼接成Bash脚本执行 cmds.join('\n') } workflow { refs().out.fa.view() }
其他实现方式
方式1:用Channel读取db.list并过滤
通过Nextflow Channel读取文件内容,更符合数据流范式:
process refs { input: tuple val(ref), val(suf), val(path) from Channel.fromPath("$baseDir/db/db.list") .map { line -> line.trim().split(/\s+/) } .map { key, path -> def (ref, suf) = key.split(/\\./) [ref, suf, path] } .filter { ref, suf, path -> ref == params.ref } output: path "${suf}", emit: "${suf}" script: """ echo "${baseDir}/db/${path}" > ${suf} """ } workflow { refs().out.fa.view() }
方式2:用配置文件管理参考路径
在nextflow.config中直接定义参考基因组路径映射,更简洁易维护:
// nextflow.config params { ref = "hg38" refs = [ hg38: [ fa: "${baseDir}/db/path1", sdf: "${baseDir}/db/path2", dbsnp: "${baseDir}/db/path3" ], hg19: [ fa: "${baseDir}/db/pathx", sdf: "${baseDir}/db/pathy" ] ] }
流程中直接调用配置:
process refs { output: path "fa", emit: fa path "sdf", emit: sdf path "dbsnp", emit: dbsnp script: """ echo "${params.refs[params.ref].fa}" > fa echo "${params.refs[params.ref].sdf}" > sdf echo "${params.refs[params.ref].dbsnp}" > dbsnp """ } workflow { refs().out.fa.view() }
内容的提问来源于stack exchange,提问作者Calli
相关产品推荐
相关产品推荐

