1 输出

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

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

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

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

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

限定符 语义
val 发送在输出通道上指定名称的变量。
file 发送在输出通道上指定名称的由进程生成的文件。
path 发送在输出通道上指定名称的由进程生成的文件(替换file)。
stdout 通过输出通道发送已执行的进程标准输出。
tuple 可以在同一输出通道上发送多个值。

1.1 输出值

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 """
}

1.2 输出文件

file限定符允许输出一个或多个文件,通过所述方法生产的,在指定的信道。例如:

process randomNum {

   output:
   file 'result.txt' into numbers

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

}

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

在上面的示例中,该过程在执行时会创建一个名为的文件,result.txt其中包含一个随机数。由于在输出之间声明了使用相同名称的文件参数,因此当任务完成时,该文件将通过numbers通道发送。声明与输入相同的通道的下游进程将能够接收它。

1.3 多个输出文件

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

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

1.4 动态输出文件名

当需要动态表示输出文件名时,可以使用动态评估字符串来定义它,该字符串引用在输入声明块或脚本全局上下文中定义的值。例如:

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

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

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

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

1.5 输出路径

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

path相对于file限定符的主要优点是,它允许指定多个输出来精细控制输出文件。

名称 描述
glob true指定的名称被解释为glob模式(默认值:true
hidden true隐藏的文件包含在配套的输出文件(默认:false
followLinks true目标文件放在任何匹配的符号链接的回报(默认值:true
type 返回的路径类型,或者filedir或者any(默认值:any,或者file如果指定的文件名模式包含** -双星-符号)
maxDepth 要访问的最大目录级别数(默认:not limit

1.6 输出“stdout”特殊文件

stdout限定符允许捕获的标准输出的执行的处理的输出,并发送过来的输出参数声明中指定的信道。例如:

process echoSomething {
    output:
    stdout channel

    "echo Hello world!"

}

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

1.7 输出值的“元组”

tuple限定符允许多个值发送到一个单一的频道。当需要将同一流程的多次执行的结果分组在一起时,此功能很有用,如以下示例所示:

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 """
}

在上面的示例中,对B 和B的每对执行BLAST任务。任务完成后,一个新元组将包含的值,并且文件将被发送到通道。

1.8 可选输出

在大多数情况下,进程将生成添加到输出通道的输出。但是,在某些情况下,对于进程来说,它是有效的。不产生输出。在这些情况下optional true可以将其添加到Output声明中,该声明告诉Nextflow,如果未创建声明的输出,则不要使进程失败。

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

在本例中,通常期望流程生成一个output.txt文件,但在文件合法丢失的情况下,进程不会失败。outChannel仅由那些确实生成output.txt