将文件名列表传递给下一个流进程



我是Nextflow的新手,正在尝试在工作流中处理多个文件。这些文件的数量超过300个,所以我不想把它作为一个选项粘贴到命令行中。所以我所做的是,我已经创建了一个文件,其中包含我需要处理的文件的每个文件名,但我不确定如何将其传递到进程中。这就是我尝试过的:

params.SRRs = "srr_ids.txt"

process tmp {
input:
file ids
output:
path  "*.txt"
script:
'''
while read id; do
touch ${id}.txt;
echo ${id} > ${id}.txt;
done < $ids
'''
}
workflow {
tmp(params.SRRs)
}

脚本应该读取文件srr_ids.txt,并创建包含其id的文件(只是在较小的任务上进行测试(。错误日志显示id变量未绑定,但我不明白为什么。向管道传递大量文件名的传统方法是什么?我应该写一些其他的过程来解析列表吗?

也许您的问题中有拼写错误,但错误实际上是ids变量未绑定:

Command error:
.command.sh: line 5: ids: unbound variable

问题是,当您使用单引号脚本字符串时,将无法访问script块中的Nextflow变量。您可以使用双引号字符串定义脚本,也可以转义shell变量:

params.SRRs = "srr_ids.txt"

process tmp {
input:
path ids
output:
path  "*.txt"
script:
"""
while read id; do
touch "${id}.txt"
echo "${id}" > "${id}.txt"
done < "${ids}"
"""
}
workflow {
SRRs = file(params.SRRs)
tmp(SRRs)
}

或者,使用shell块,该块使用感叹号!字符作为Nextflow变量的变量占位符。这使得在同一段代码中同时使用Nextflow和shell变量成为可能,而不必转义每个shell变量:

params.SRRs = "srr_ids.txt"

process tmp {
input:
path ids
output:
path  "*.txt"
shell:
'''
while read id; do
touch "${id}.txt"
echo "${id}" > "${id}.txt"
done < "!{ids}"
'''
}
workflow {
SRRs = file(params.SRRs)
tmp(SRRs)
}

将大量文件名传递给管道

我认为,传统的方法是向fromPath通道工厂方法实际提供一个(或多个(glob模式。例如:

params.SRRs = "./path/to/files/SRR*.fastq.gz"
workflow {
Channel
.fromPath( params.SRRs )
.view()
}

结果:

$ nextflow run main.nf
N E X T F L O W  ~  version 22.04.4
Launching `main.nf` [sleepy_bernard] DSL2 - revision: 30020008a7
/home/steve/working/stackoverflow/73702711/path/to/files/SRR1910483.fastq.gz
/home/steve/working/stackoverflow/73702711/path/to/files/SRR1910482.fastq.gz
/home/steve/working/stackoverflow/73702711/path/to/files/SRR1448795.fastq.gz
/home/steve/working/stackoverflow/73702711/path/to/files/SRR1448793.fastq.gz
/home/steve/working/stackoverflow/73702711/path/to/files/SRR1448794.fastq.gz
/home/steve/working/stackoverflow/73702711/path/to/files/SRR1448792.fastq.gz

如果您更喜欢传递文件名列表,如您的示例中所示,请使用splitCsvsplitText运算符来获得所需内容。例如:

params.SRRs = "srr_ids.txt"
workflow {

Channel
.fromPath( params.SRRs )
.splitText() { it.strip() }
.view()
}

结果:

$ nextflow run main.nf 
N E X T F L O W  ~  version 22.04.4
Launching `main.nf` [fervent_ramanujan] DSL2 - revision: 89a1771d50
SRR1448794
SRR1448795
SRR1448792
SRR1448793
SRR1910483
SRR1910482

我应该编写其他解析列表的进程吗?

您可能不需要。我的感觉是,您的代码可能会从使用fromSRA工厂方法中受益,但我们确实没有足够的细节来说明这一点。如果需要的话,您可以编写一个返回通道的函数。

最新更新