Nextflow技术问题:如何处理不同目录下文件的所有配对?
如何在Nextflow中生成文件的所有可能配对?
目录结构
|-- combine.nf |-- first | |-- a.txt | |-- b.txt | `-- c.txt |-- second | |-- A.txt | `-- B.txt
原Nextflow代码
#!/usr/bin/env nextflow process sayHello { input: path first path second output: stdout script: """ echo 'Hello couple (${first}, ${second})' """ } workflow { def files_first = Channel.fromPath("first/*.txt") def files_second = Channel.fromPath("second/*.txt") sayHello(files_first, files_second) | view { it } }
当前运行结果
Hello couple (a.txt, A.txt) Hello couple (b.txt, B.txt)
当前代码仅生成两组配对(取文件数量较少的目录的文件数),我们需要生成所有可能的文件配对,实际场景中其中一个目录仅包含一个文件。
解决方案
Nextflow默认将两个通道直接传入进程时,会按位置配对(类似zip操作),仅保留到较短通道的长度。要生成笛卡尔积形式的全配对,需使用cross操作符。
修改后的代码如下:
#!/usr/bin/env nextflow process sayHello { input: path first path second output: stdout script: """ echo 'Hello couple (${first}, ${second})' """ } workflow { def files_first = Channel.fromPath("first/*.txt") def files_second = Channel.fromPath("second/*.txt") // 用cross生成所有元素的笛卡尔积配对 files_first.cross(files_second) | sayHello | view { it } }
预期运行结果
Hello couple (a.txt, A.txt) Hello couple (a.txt, B.txt) Hello couple (b.txt, A.txt) Hello couple (b.txt, B.txt) Hello couple (c.txt, A.txt) Hello couple (c.txt, B.txt)
若其中一个目录仅含单个文件,比如second目录只有A.txt,cross会自动生成3×1=3组配对,完全适配实际场景。
内容的提问来源于stack exchange,提问作者Pierre Peterlongo
相关产品推荐
相关产品推荐

