Nextflow 快速搭建生信分析流程(八)- Combine Operators

本节我们介绍Nextflow中的Combine Operators类型。Combine-operators-合并操作符合并操作符包含以下类型:joincrosscollectFilecombineconcatmixspreadtap1. joinjoin操作符用于将连个channel按照匹配的键合并在一起,默认是按照第一个元素进行匹配;left = Channel.from(['X', 1], ['Y', 2], ['Z', 3], ['P', 7])right= Channel.from(['Z', 6], ['Y', 5], ['X', 4])left.join(right).view()结果如下:[Z, 3, 6][Y, 2, 5][X, 1, 4]join中可选参数如下:参数描述by按照指定的索引进行分组,默认是0,如果多个键可以使用列表[0,1]remainder当设置为false时,剩余没有分组的会丢弃failOnDuplicate存在重复的键会报错failOnMismatch如果没有匹配的键时会报错2. mixmix操作符用于将两个channel中的元素合并;c1 = Channel.from( 1,2,3 )c2 = Channel.from( 'a','b' )c3 = Channel.from( 'z' )c1 .mix(c2,c3).subscribe onNext: { println it }, onComplete: { println 'Done' }mix之后的元素输出顺序可能会被打乱;3. crosscross操作符用于将两个channel中的元素合并,并按照第一个channel中元素的顺序按照匹配的元素和第二个channel进行组合:source = Channel.from( [1, 'alpha'], [2, 'beta'] )target = Channel.from( [1, 'x'], [1, 'y'], [1, 'z'], [2,'p'], [2,'q'], [2,'t'] )source.cross(target).view()[ [1, alpha], [1, x] ][ [1, alpha], [1, y] ][ [1, alpha], [1, z] ][ [2, beta], [2, p] ][ [2, beta], [2, q] ][ [2, beta], [2, t] ]4. collectFilecollectFile用于将channel中释放的文件存储到一个或多个文件中,并将结果存储到一个新的channel中。最简单的方式,将所有的内容保存到一个文件中,只需要指定一个存储的文件名称即可以,如:Channel.from('alpha', 'beta', 'gamma').collectFile(name: 'sample.txt', newLine: true).subscribe {println "Entries are saved to file: $it"println "File content is: ${it.text}"}第二种方式为将文件按照动态的标准进行分组,分组的标准是按照闭包的形式进行指定,如:Channel.from('Hola', 'Ciao', 'Hello', 'Bonjour', 'Halo').collectFile() { item ->[ "${item[0]}.txt", item + '\n' ]}.subscribe {println "File ${it.name} contains:"println it.text}File 'B.txt' contains:BonjourFile 'C.txt' contains:CiaoFile 'H.txt' contains:HaloHolaHellocollectFile 中可以设置的参数如下:参数描述keepHeader用于指定文件头的信息,可以指定多行,除了第一个文件外,其他文件头信息均会被省略name存储文件的名称newLine是否在每一项的后面插入一个空行;seed设置文件内容的初始种子值;skip用于跳过文件前面的行数,例如skip:1sort对元素进行排序,具体的排序参数见下表storeDir用于存储结果文件的目录tempDir临时文件的存储目录可以通过sort参数对文件的内容进行排序,排序的标准可以按照下面的方式:参数描述false不启用sort方法,按照内容产生的方式附加到文件中;true按照自然的排序方式,如数字,字母等'index’按照赋给每个元素的索引进行排序'hash’按照hash值进行排序'deep’如果含有文件内容时,会按照每个文件的内容产生hash'custom’按照自定义的排序标准进行排序,可以使用闭包等Channel.from('Z'..'A').collectFile(name:'result', sort: true, newLine: true).view { it.text }ABC:ZChannel.fromPath('/data/sequences.fa').splitFasta( record: [id: true, sequence: true] ).collectFile( name:'result.fa', sort: { it.size() } ) {it.sequence}.view { it.text }5. combinecombine操作符用于将两个channel中的元素按照笛卡尔乘积的方式进行组合;numbers = Channel.from(1,2,3)words = Channel.from('hello', 'ciao')numbers.combine(words).view()# outputs[1, hello][2, hello][3, hello][1, ciao][2, ciao][3, ciao]第二种组合方式为按照元素的索引进行组合:left = Channel.from(['A',1], ['B',2], ['A',3])right = Channel.from(['B','x'], ['B','y'], ['A','z'], ['A', 'w'])left.combine(right, by: 0).view()# outputs[A, 1, z][A, 3, z][A, 1, w][A, 3, w][B, 2, x][B, 2, y]

(0)

相关推荐