在闭包中使用正则表达式捕获组重命名 .fromFilePairs

renameing .fromFilePairs with regex capture group in closure

我是 nextflow/groovy/java 的新手,我 运行 在完成简单的正则表达式任务时遇到了一些困难。

我正在尝试更改某些文件对的标签。 我的理解是 fromFilePairs returns 形式的数据结构:

[
    [common_prefix, [file1, file2]],
    [common_prefix, [file3, file4]]
]

我进一步认为:

然而,我已经尝试了以下许多变体但没有成功:

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()