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

Nextflow中while循环调用tax_ids报错:未找到变量tax_id

问题排查:Nextflow流程中tax_id未找到错误

问题代码与错误信息

Process代码

process extract_key_species {

    input:
    tuple val(sample_ID), path(fastq1), path(fastq2), path(kaiju_out), val(tax_ids)

    output:
    tuple val(sample_ID), file("*_R1.fastq.gz"), file("*_R2.fastq.gz")

    script:
    """
    echo "${tax_ids}" | tr ',' '\\n' > "${sample_ID}_tax_ids.list"

    # Debugging to confirm the list was created
    echo "Created tax ID list:"
    cat "${sample_ID}_tax_ids.list"

    while IFS= read -r tax_id; do
        echo "Processing tax_id: ${tax_id}"

        grep -Ew "${tax_id}" "${kaiju_out}" | cut -f2 > "${sample_ID}_${tax_id}_ids.tsv"
        seqtk subseq "${fastq1}" "${sample_ID}_${tax_id}_ids.tsv" | gzip -c > "${sample_ID}_${tax_id}_R1.fastq.gz"
        seqtk subseq "${fastq2}" "${sample_ID}_${tax_id}_ids.tsv" | gzip -c > "${sample_ID}_${tax_id}_R2.fastq.gz"

        echo "Generated FASTQ files for tax_id: ${tax_id}"
    done < "${sample_ID}_tax_ids.list"
    """
}

Workflow代码

workflow Assemble {
    assemble_input = Channel.fromPath(params.tsv)
        .splitCsv(sep: "\t", header: true, strip: true)
        .map { it -> [it['sample_id'], it['fastq_r1'], it['fastq_r2'], it['kaiju_out'], it['tax_ids']] }

    extract_key_species_in_out = extract_key_species(assemble_input)
    extract_key_species_in_out.view()
}

错误信息

ERROR ~ Error executing process > 'Assemble:extract_key_species (sample1)'

Caused by:
  No such variable: tax_id -- Check script 'mainpython1.nf' at line: 15

错误原因

Nextflow会优先解析双引号包裹的脚本块中的${变量名}语法,将其视为Nextflow流程定义的变量。而tax_id是bash循环内的局部shell变量,并未在Nextflow流程中定义,因此Nextflow尝试解析时会抛出"未找到变量"的错误。

解决方案

有两种可行的修复方式:

方式1:转义shell变量的$符号

将脚本中所有bash循环的${tax_id}转义为\${tax_id},让Nextflow跳过解析,留给bash处理:

process extract_key_species {

    input:
    tuple val(sample_ID), path(fastq1), path(fastq2), path(kaiju_out), val(tax_ids)

    output:
    tuple val(sample_ID), file("*_R1.fastq.gz"), file("*_R2.fastq.gz")

    script:
    """
    echo "${tax_ids}" | tr ',' '\\n' > "${sample_ID}_tax_ids.list"

    # Debugging to confirm the list was created
    echo "Created tax ID list:"
    cat "${sample_ID}_tax_ids.list"

    while IFS= read -r tax_id; do
        echo "Processing tax_id: \${tax_id}"

        grep -Ew "\${tax_id}" "${kaiju_out}" | cut -f2 > "${sample_ID}_\${tax_id}_ids.tsv"
        seqtk subseq "${fastq1}" "${sample_ID}_\${tax_id}_ids.tsv" | gzip -c > "${sample_ID}_\${tax_id}_R1.fastq.gz"
        seqtk subseq "${fastq2}" "${sample_ID}_\${tax_id}_ids.tsv" | gzip -c > "${sample_ID}_\${tax_id}_R2.fastq.gz"

        echo "Generated FASTQ files for tax_id: \${tax_id}"
    done < "${sample_ID}_tax_ids.list"
    """
}

方式2:使用原始字符串包裹脚本

Nextflow支持用三个单引号(''')包裹脚本内容,此时内部的${}语法不会被Nextflow解析,直接传递给bash执行:

process extract_key_species {

    input:
    tuple val(sample_ID), path(fastq1), path(fastq2), path(kaiju_out), val(tax_ids)

    output:
    tuple val(sample_ID), file("*_R1.fastq.gz"), file("*_R2.fastq.gz")

    script:
    '''
    echo "'"${tax_ids}"'" | tr ',' '\\n' > "'"${sample_ID}"'"_tax_ids.list"

    # Debugging to confirm the list was created
    echo "Created tax ID list:"
    cat "'"${sample_ID}"'"_tax_ids.list"

    while IFS= read -r tax_id; do
        echo "Processing tax_id: ${tax_id}"

        grep -Ew "${tax_id}" "'"${kaiju_out}"'" | cut -f2 > "'"${sample_ID}"'"_${tax_id}_ids.tsv"
        seqtk subseq "'"${fastq1}"'" "'"${sample_ID}"'"_${tax_id}_ids.tsv" | gzip -c > "'"${sample_ID}"'"_${tax_id}_R1.fastq.gz"
        seqtk subseq "'"${fastq2}"'" "'"${sample_ID}"'"_${tax_id}_ids.tsv" | gzip -c > "'"${sample_ID}"'"_${tax_id}_R2.fastq.gz"

        echo "Generated FASTQ files for tax_id: ${tax_id}"
    done < "'"${sample_ID}"'"_tax_ids.list"
    '''
}

注意:使用三个单引号时,Nextflow变量需要用"'${变量名}'"的格式拼接,确保bash能正确识别。

内容的提问来源于stack exchange,提问作者C0DiFire

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:04:50