You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nextflow报错Unexpected character: '"',求原因及替代实现方式

报错原因及解决方法

报错原因

  1. Script块语法混合错误:Nextflow的script块中,你把Groovy循环逻辑和Bash命令直接混写,循环内的"echo $value > $suf"只是一个Groovy字符串,没有被正确输出为要执行的Bash命令,导致Nextflow解析器识别到非法的双引号语法。
  2. 正则分隔符错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 06:52:43