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
相关产品推荐
相关产品推荐

