我创建了一个简单的csv作为工作流的一部分,如下所示:
sample,value
A,1
B,0.5
另外,我有另一个通道,其文件名与样品名匹配。我希望能够在新过程中使用与每个样品名关联的值。
我尝试过使用.splitCsv拆分CSV,但是(意料之中的)有时候样本使用了不正确的值,尽管它确实运行了正确的次数。我也尝试过在脚本中使用awk提取相应的值并将其保存到变量中,这会导致使用正确的值,但是它会消耗CSV文件,因此只处理了一个样本。
超级简化的下一个流(DSL 2)脚本:
# !/usr/bin/env nextflow
nextflow.enable.dsl=2
process foo {
input:
path input_file
output:
path 'file.csv', emit csv
"""
script that creates csv
"""
}
process bar {
input:
path input_file2
output:
path 'file.bam', emit bam
"""
script that creates bam files
"""
}
process help_me {
input:
path csv
path bam
output:
path 'result'
"""
script that uses value from csv on associated bam file
"""
}
workflow {
foo(params.input)
bar(params.input2)
help_me(foo.out.csv, bar.out.bam)
}
谢谢你!
编辑:本质上,有没有一种方法可以同步两个通道,这样我就可以使用一个csv的单独行与关联的文件?
1条答案
按热度按时间wsewodh21#
如果您有价值通道,则可以无限次重复使用文件(如CSV),而不会占用通道。例如:
这里,
input1
和input2
都是价值通道。当输入在
from
子句中指定简单值时,值通道由进程隐式创建。此外,值通道还隐式创建为输入仅为值通道的进程的输出。意味着
foo.out.csv
和bar.out.bam
也是值通道。此外,help_me.out
也是值通道。如果input2
是队列通道,则可以看到input1
可以无限次重用:第一个
结果:
请注意,
bar.out.bam
和help_me.out
现在是队列通道。相反,如果每个样本(或类似的配置)有一个CSV,那么您将需要一些方法来连接这些通道,并相应地调整新流程的输入声明。您希望避免的是在输入块中声明两个(或更多)队列通道。docs的这一部分是非常值得投入时间的:了解多个输入通道是如何工作的,并解释为什么在使用splitCsv输出时会看到与特定样本相关联的错误值。要连接这些通道,可以使用连接运算符。例如,给定您的简单CSV(如'foo.csv')和先前创建的测试bams:
结果:
如果您的CSV中有多个粒子样本值,并且这些值是在单独的行中指定的,则您可能需要使用合并运算符。例如,如果您的“foo.csv”包含:
在上面的示例中,用
combine( rows_ch, by:0 )
替换,join( rows_ch )
。结果: