我是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
如果您更喜欢传递文件名列表,如您的示例中所示,请使用splitCsv
或splitText
运算符来获得所需内容。例如:
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
工厂方法中受益,但我们确实没有足够的细节来说明这一点。如果需要的话,您可以编写一个返回通道的函数。