在闭包中使用正则表达式捕获组重命名 .fromFilePairs
renameing .fromFilePairs with regex capture group in closure
我是 nextflow/groovy/java 的新手,我 运行 在完成简单的正则表达式任务时遇到了一些困难。
我正在尝试更改某些文件对的标签。
我的理解是 fromFilePairs
returns 形式的数据结构:
[
[common_prefix, [file1, file2]],
[common_prefix, [file3, file4]]
]
我进一步认为:
.name
方法在此列表中的项目上调用时将给出名称,我在上面标记为 common_prefix
- 与
fromFilePairs
一起使用的闭包返回的值设置文件对的名称。
- 与
fromFilePairs
一起使用的闭包中 it
的值是文件对列表中的单个项目。
然而,我已经尝试了以下许多变体但没有成功:
params.fastq = "$baseDir/data/fastqs/*_{1,2}_*.fq.gz"
Channel
.fromFilePairs(params.fastq, checkIfExists:true) {
file ->
// println file.name // returned the common file prefix as I expected
mt = file.name =~ /(common)_(prefix)/
// println mt
// # java.util.regex.Matcher[pattern=(common)_(prefix) region=0,47 lastmatch=]
// match objects appear empty despite testing with regexs I know to work correctly including simple stuff like (.*) to rule out issues with my regex
// println mt.group(0) // #No match found
mt.group(0) // or a composition like mt.group(0) + "-" + mt.group(1)
}
.view()
我也使用 replaceAll
方法尝试了一些变体。
我已经查阅了 nextflow、groovy 和 java 的文档,但我仍然无法弄清楚我遗漏了什么。我希望这是一些愚蠢的语法问题或对数据结构的误解,但我厌倦了用头撞它,因为对于更了解该语言的人来说这可能是显而易见的 - 我很感激任何能启发我了解它是如何工作的人.
可以向 fromfilepairs operator 提供闭包以实现自定义文件对分组策略。它需要一个文件,并且应该 return 分组键。文档中的示例只是按文件扩展名对文件进行分组:
Channel
.fromFilePairs('/some/data/*', size: -1) { file -> file.extension }
.view { ext, files -> "Files with the extension $ext are $files" }
如果您只想更改某些文件对的标签,则没有必要这样做。您可以为此使用 map operator。 fromFilePairs op 发出元组,其中第一个元素是匹配对的 'grouping key',第二个元素是 'list of files'(按字典顺序排序):
Channel
.fromFilePairs(params.fastq, checkIfExists:true) \
.map { group_key, files ->
tuple( group_key.replaceAll(/common_prefix/, ""), files )
} \
.view()
我是 nextflow/groovy/java 的新手,我 运行 在完成简单的正则表达式任务时遇到了一些困难。
我正在尝试更改某些文件对的标签。
我的理解是 fromFilePairs
returns 形式的数据结构:
[
[common_prefix, [file1, file2]],
[common_prefix, [file3, file4]]
]
我进一步认为:
.name
方法在此列表中的项目上调用时将给出名称,我在上面标记为common_prefix
- 与
fromFilePairs
一起使用的闭包返回的值设置文件对的名称。 - 与
fromFilePairs
一起使用的闭包中it
的值是文件对列表中的单个项目。
然而,我已经尝试了以下许多变体但没有成功:
params.fastq = "$baseDir/data/fastqs/*_{1,2}_*.fq.gz"
Channel
.fromFilePairs(params.fastq, checkIfExists:true) {
file ->
// println file.name // returned the common file prefix as I expected
mt = file.name =~ /(common)_(prefix)/
// println mt
// # java.util.regex.Matcher[pattern=(common)_(prefix) region=0,47 lastmatch=]
// match objects appear empty despite testing with regexs I know to work correctly including simple stuff like (.*) to rule out issues with my regex
// println mt.group(0) // #No match found
mt.group(0) // or a composition like mt.group(0) + "-" + mt.group(1)
}
.view()
我也使用 replaceAll
方法尝试了一些变体。
我已经查阅了 nextflow、groovy 和 java 的文档,但我仍然无法弄清楚我遗漏了什么。我希望这是一些愚蠢的语法问题或对数据结构的误解,但我厌倦了用头撞它,因为对于更了解该语言的人来说这可能是显而易见的 - 我很感激任何能启发我了解它是如何工作的人.
可以向 fromfilepairs operator 提供闭包以实现自定义文件对分组策略。它需要一个文件,并且应该 return 分组键。文档中的示例只是按文件扩展名对文件进行分组:
Channel
.fromFilePairs('/some/data/*', size: -1) { file -> file.extension }
.view { ext, files -> "Files with the extension $ext are $files" }
如果您只想更改某些文件对的标签,则没有必要这样做。您可以为此使用 map operator。 fromFilePairs op 发出元组,其中第一个元素是匹配对的 'grouping key',第二个元素是 'list of files'(按字典顺序排序):
Channel
.fromFilePairs(params.fastq, checkIfExists:true) \
.map { group_key, files ->
tuple( group_key.replaceAll(/common_prefix/, ""), files )
} \
.view()