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

问题描述

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

我正在尝试更改某些文件对的标签。 据我了解,fromFilePairs 返回以下形式的数据结构:

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

我进一步认为:

  • 在此列表中的项目上调用 .name 方法时将给出名称,我在上面标记common_prefix
  • fromFilePairs 一起使用的闭包返回的值设置文件对的名称
  • it 一起使用的闭包中 fromFilePairs 的值是文件对列表中的单个项目。

但是,我在以下方面尝试了许多变体,但都没有成功:

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 提供闭包以实现自定义文件对分组策略。它需要一个文件并且应该返回分组键。文档中的示例只是按文件扩展名对文件进行分组:

Channel
    .fromFilePairs('/some/data/*',size: -1) { file -> file.extension }
    .view { ext,files -> "Files with the extension $ext are $files" }

如果您只想更改某些文件对的标签,则没有必要这样做。您可以为此使用 map operator。 fromFilePairs 操作发出元组,其中第一个元素是匹配对的“分组键”,第二个元素是“文件列表”(按字典顺序排序):

Channel
    .fromFilePairs(params.fastq,checkIfExists:true) \
    .map { group_key,files ->

        tuple( group_key.replaceAll(/common_prefix/,""),files )
    } \
    .view()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...