匹配下一个流 glob 中的零个或多个运算符

Match-zero-or-more operator in nextflow glob

我正在尝试创建一个健壮的 glob 模式,它将匹配我们收到的用于 fastq 文件的大多数不同命名约定。但是,我在 HPC 上使用的 nextflow 版本 (20.10.0) 似乎不接受我写的内容。

以下是文件名的一些示例:

19_S8_R1_001.fastq.gz    19_S8_R2_001.fastq.gz
F1HD1_S28_R1.fastq.gz    F1HD1_S28_R2.fastq.gz 
SRR3137747_1.fastq       SRR3137747_2.fastq

我最初编写的与 fromFilePairs 运算符一起使用的模式是 *_?(R){1,2}?(_001).f?(ast)q?(.gz)。我在 bash 环境中测试过。这是在包含前两个示例文件的目录中进行测试的输出:

-bash-4.2$ shopt -s extglob
-bash-4.2$ ls -1 *_?(R){1,2}?(_001).f?(ast)q?(.gz)
19_S8_R1_001.fastq.gz
19_S8_R2_001.fastq.gz

但是当我尝试使用 nextflow 运行 时,它只是给了我输入 ifEmpty 运算符的错误消息。

我最终让它工作了,但是使用这个模式:*_{R1,R2,1,2}{.fastq.gz,.fq.gz,.fastq,.fq,_001.fastq.gz,_001.fq.gz,_001.fastq,_001.fq},它不是特别可靠。

除非我在 nextflow 文档中遗漏了它(以及我找到的有关 glob 的信息),否则我在 nextflow 中看不到匹配零个或多个运算符的替代方案。任何替代解决方案?

提前致谢。

以下 glob 模式似乎与一些更常见的 FASTQ 文件名匹配:

Channel
    .fromFilePairs( '*_{,R}{1,2}{,_001}.{fq,fastq}{,.gz}' )
    .view()

或带参数化目录前缀:

Channel
    .fromFilePairs( "${params.input_dir}/*_{,R}{1,2}{,_001}.{fq,fastq}{,.gz}" )
    .view()

结果:

N E X T F L O W  ~  version 21.04.3
Launching `script.nf` [serene_austin] - revision: 5527b9b3c0
[SRR3137747, [/path/to/fasta/SRR3137747_1.fastq, /path/to/fasta/SRR3137747_2.fastq]]
[19_S8, [/path/to/fasta/19_S8_R1_001.fastq.gz, /path/to/fasta/19_S8_R2_001.fastq.gz]]
[F1HD1_S28, [/path/to/fasta/F1HD1_S28_R1.fastq.gz, /path/to/fasta/F1HD1_S28_R2.fastq.gz]]

另一个可能更健壮(和可读)的选项是利用这样一个事实,即您可以使用列表作为参数指定多个 glob 模式,并动态构建您的 glob 模式列表:

nextflow.enable.dsl=2

params.input_dir = '/path/to/fasta'


def cartesian_product(A, B) {
    A.collectMany{ a -> B.collect { b -> [a, b] } }
}

def extensions = [
    '.fastq.gz',
    '.fastq',
    '.fq.gz',
    '.fq',
]

def suffixes = [
    '*_R{1,2}_001',
    '*_R{1,2}',
    '*_{1,2}',
]

workflow {

    def patterns = cartesian_product(suffixes, extensions).collect { 
        "${params.input_dir}/${it.join()}"
    } 

    Channel.fromFilePairs( patterns ).view()
}

结果:

N E X T F L O W  ~  version 21.04.3
Launching `script.nf` [deadly_payne] - revision: 6d2472ef23
[19_S8, [/path/to/fasta/19_S8_R1_001.fastq.gz, /path/to/fasta/19_S8_R2_001.fastq.gz]]
[F1HD1_S28, [/path/to/fasta/F1HD1_S28_R1.fastq.gz, /path/to/fasta/F1HD1_S28_R2.fastq.gz]]
[SRR3137747, [/path/to/fasta/SRR3137747_1.fastq, /path/to/fasta/SRR3137747_2.fastq]]