匹配下一个流 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]]
我正在尝试创建一个健壮的 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]]