输出

输出声明块允许定义所使用的过程中发出所产生的结果的信道。

最多可以定义一个输出块,并且可以包含一个或多个输出声明。输出块遵循以下语法:

output:
<output qualifier> <output name> [into <target channel>[,channel,..]] [attribute [,..]]

输出定义以输出限定符和输出名称开头,后跟关键字​​into​​和一个或多个通过其发送输出的通道。最后,可以指定一些可选属性。

注意,当输出名称与通道名称相同时,​​into​​可以省略声明的一部分。

下表中列出了可以在输出声明块中使用的限定符:

预选赛

语义的

val

发送具有在输出通道上指定的名称的变量。

file

发送在输出通道上指定名称的由进程生成的文件。

path

发送在输出通道上指定名称的由进程生成的文件(替换​​file​​)。

env

使用在输出通道上指定的名称发送在流程环境中定义的变量。

stdout

通过输出通道发送已执行的进程标准输出。

tuple

可以通过同一输出通道发送多个值。

输出值

​val​​限定符允许输出一个值在脚本上下文中定义。

在常见的使用场景中,这是在输入声明块中定义的值,如以下示例所示:

methods = ['prot','dna', 'rna']

process foo {
input:
val x from methods

output:
val x into receiver

"""
echo $x > file
"""

}

receiver.println { "Received: $it" }

有效的输出值是值文字,输入值标识符,过程范围中可访问的变量和值表达式。例如:

process foo {
input:
file fasta from 'dummy'

output:
val x into var_channel
val 'BB11' into str_channel
val "${fasta.baseName}.out" into exp_channel

script:
x = fasta.name
"""
cat $x > file
"""
}

输出文件

​file​​限定符允许输出一个或多个文件,例如:

process randomNum {

output:
file 'result.txt' into numbers

'''
echo $RANDOM > result.txt
'''

}

numbers.subscribe { println "Received: " + it.text }

在上面的示例中,该过程在执行时会创建一个名为的​​result.txt​​文件,其中包含随机数。

在输出中声明了使用相同名称的文件参数

因此当任务完成时,该文件将通过​​numbers​​通道发送。

与输入声明相同的通道下游进程将能够接收它。

需要注意,如果指定为输出的通道先前未在管道脚本中声明,则它将由输出声明本身隐式创建。

多个输出文件

当输出文件名包含​​*​​​或​​?​​​通配符时,它将被解释为​​全局​​路径匹配器。这样可以将多个文件捕获到一个列表对象中,并将其作为唯一的输出。例如:

process splitLetters {

output:
file 'chunk_*' into letters

'''
printf 'Hola' | split -b 1 - chunk_
'''
}

letters
.flatMap()
.subscribe { println "File: ${it.name} => ${it.text}" }

它打印:

File: chunk_aa => H
File: chunk_ab => o
File: chunk_ac => l
File: chunk_ad => a

注意

在上面的示例中,运算符​​flatMap​​​用于将​​letters​​通道发出的文件列表转换为独立发出每个文件对象的通道。

关于全局模式行为的一些警告:


  • 输入文件不包括在可能的匹配列表中。
  • 球形模式与文件和目录路径匹配。
  • 当使用两星模式​​**​​在目录间求助时,仅文件路径匹配,即目录不包括在结果列表中。

警告

尽管与glob输出声明匹配的输入文件不包括在结果输出通道中,但是这些文件仍可以从任务暂存目录传输到目标任务工作目录。因此,为避免不必要的文件复制,建议在定义输出文件时避免使用宽松的通配符,例如。而是使用前缀或后缀命名符号将匹配文件集限制为仅预期文件,例如。​​file '*'``file 'prefix_*.sorted.bam'​

默认情况下,与指定的glob模式匹配的所有文件都作为唯一(列表)项由通道发出。通过在输出文件声明中添加属性,还可以将每个文件作为唯一项发出。​​mode flatten​

通过使用该​​mode​​属性,可以如下所示重写前面的示例:

process splitLetters {

output:
file 'chunk_*' into letters mode flatten

'''
printf 'Hola' | split -b 1 - chunk_
'''
}

letters .subscribe { println "File: ${it.name} => ${it.text}" }

警告

从​​mode​​​19.10.0版开始不推荐使用该选项。 而是在下游过程中使用操作员​​收集​​。

在以下链接中了解有关glob语法的更多信息。​​什么是glob?​

动态输出文件名

当需要动态表达输出文件名时,可以使用动态评估字符串来定义它,

该字符串引用在输入声明块或脚本全局上下文中定义的值。例如:

process align {
input:
val x from species
file seq from sequences

output:
file "${x}.aln" into genomes

"""
t_coffee -in $seq > ${x}.aln
"""
}

在上面的示例中,每次执行该过程时,都会生成一个对齐文件,其名称取决于​​x​​输入的实际值。

小费

使用Nextflow时,输出文件的管理是一个非常普遍的误解。使用其他工具,通常需要将输出文件组织成某种目录结构或保证唯一的文件名方案,以使结果文件不会相互覆盖,并且下游任务可以唯一地引用它们。

使用Nextflow,在大多数情况下,您无需为输出文件命名,因为每个任务都在其自己的唯一临时目录中执行,因此由不同任务生成的文件永远不会相互覆盖。通过使用​​元组输出​​限定符,也可以将元数据与输出关联,而不是将它们包含在输出文件名中。

综上所述,在可能的情况下,最好使用具有静态名称而不是动态名称的输出文件,因为这将导致代码更简单,更可移植。

输出路径

的​​path​​​输出限定符被Nextflow版本19.10.0引入,这是一个简易替换为​​file​​​输出限定符,因此它是后向兼容的语法和用于输入语义​​file​​如上所述。

​path​​​over ​​file​​qualifier 的主要优点在于,它允许指定多个输出来精细控制输出文件。

名称

描述

glob

当​​true​​​指定的名称被解释为glob模式(默认值:​​true​​)

hidden

当​​true​​​隐藏的文件包含在配套的输出文件(默认:​​false​​)

followLinks

当​​true​​​目标文件放在任何匹配的符号链接的回报(默认值:​​true​​)

type

返回的路径类型,或者​​file​​​,​​dir​​​或者​​any​​​(默认值:​​any​​​,或者​​file​​如果指定的文件名模式包含** -双星-符号)

maxDepth

要访问的最大目录级别数(默认值:无限制)

includeInputs

当​​true​​包含与输出文件全局模式匹配的任何输入文件时。

Nextflow 19.10.0 重大更新:​​file​​​限定符解释​​:​​​为路径分隔符,因此​​file 'foo:bar'​​​ 捕获文件​​foo​​​ 和​​bar​​​。在​​path​​​ 限定符解释中,它只是一个普通的文件名字符,因此​​path 'foo:bar'​​​输出定义捕获与名称的输出文件​​foo:bar​​。

使用Nextflow 19.10.0或更高版本时,路径限定符应优先于文件,以处理进程输出文件。

输出​​stdout​

在​​stdout​​限定词中,您可以捕捉的标准输出的执行过程中的输出和发送过来的输出参数声明中指定的通道。例如:

process echoSomething {
output:
stdout hello

"""
echo Hello world!
"""
}

hello.subscribe { print "I say.. $it" }

输出​​env​

​env​​限定符允许您捕获在处理执行环境中定义的变量,并发送过来的输出参数声明中指定的信道:

process myTask {
output:
env FOO into target
script:
'''
FOO=$(ls -la)
'''
}

target.view { "directory content: $it" }

输出​​tuple​

​tuple​​限定符允许多个值发送到单一的 channel。

当需要将同一流程的多次执行的结果分组在一起时,此功能很有用,示例如下:

query_ch = Channel.fromPath '*.fa'
species_ch = Channel.from 'human', 'cow', 'horse'

process blast {

input:
val species from query_ch
file query from species_ch

output:
tuple val(species), file('result') into blastOuts

script:
"""
blast -db nr -query $query > result
"""
}

在上面的示例中,对 ​​species​​​ 和​​query​​​ 的每对执行BLAST任务。当任务完成时,一个新的元组(包含​​species​​​ 和 ​​result​​​ 文件)将文件发送到​​blastOuts​​ 通道 。

元组声明可以包含以下限定符及组合:​​val​​​,​​file​​​和​​stdout​​。


默认情况下,​变量标识符被解释为值,而字符串文字则被解释为文件​,因此可以使用如下所示的短符号重写上述输出元组。


output:
tuple species, 'result' into blastOuts

可以按照动态方式定义文件名,如​​动态输出文件名​​部分所述。

可选输出

在大多数情况下,需要一个 process 来生成输出,并将其添加到输出通道。

但是,在某些情况下,process 不生成输出的。可以添加​​optional true​​到输出声明中,告诉Nextflow如果未创建声明的输出,则不要使进程失败。

output:
file("output.txt") optional true into outChannel

在此示例中,希望该过程生成​​output.txt​​​文件,但是在合法丢失文件的情况下,该过程不会失败。​​outChannel​​​仅由确实生成的那些进程填充​​output.txt​​。

When 声明

该​​when​​声明允许您定义必须按顺序执行的过程进行验证的条件。这可以是任何评估布尔值的表达式。

根据各种输入和参数的状态启用/禁用过程执行非常有用。例如:

process find {
input:
file proteins
val type from dbtype

when:
proteins.name =~ /^BB11.*/ && type == 'nr'

script:
"""
blastp -query $proteins -db nr
"""

}