【问题标题】:renameing .fromFilePairs with regex capture group in closure在关闭时使用正则表达式捕获组重命名 .fromFile Pairs
【发布时间】:2021-06-06 10:10:01
【问题描述】:

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

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

[
    [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 的文档,但我仍然无法弄清楚我缺少什么。我希望这是一些愚蠢的句法或对数据结构的误解,但是当这对于更了解该语言的人来说可能很明显时,我已经厌倦了用头撞它-我会很感激任何能启发我了解它是如何工作的人.

【问题讨论】:

    标签: java regex groovy regex-group nextflow


    【解决方案1】:

    可以为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()
    

    【讨论】:

    • 啊,谢谢,我知道我可以用有意义的地图来做到这一点。我仍然不确定我是否理解 fromFilePairs 上的闭包在做什么,因为我认为我所做的应该给它的组数是你对数据结构的描述的文件对的两倍,这是我所期望的产生错误不会默默地失败。此外,如果我给了它正确的数字或​​组名,它不应该只是用不同的名称重新创建相同的分组,即使重新定义分组对于实现重命名是不必要的?
    • 数据结构基本上就是您所描述的:通道发出具有两个元素的元组:组键和文件列表。我认为您拥有的代码并没有完全静默失败。我认为问题在于您需要将 size: -1 指定为 fromFilePairs 操作的选项(如上面的示例)。 'size' 定义了每个发出的项目应该包含的文件数,默认大小为 2。因此,如果您的返回键匹配两个文件以外的任何内容,则操作员不会发出该项目。
    • 最后一个问题的答案是肯定的。所以我想如果你愿意,你可以自己创建分组。只要确保它总是返回预期数量的元素,你应该没问题......另外,不要返回mt.group(0),试试例如:mt[0][1]。见:stackoverflow.com/a/764503/751863
    猜你喜欢
    • 1970-01-01
    • 2019-03-17
    • 2011-03-03
    • 2014-10-27
    • 1970-01-01
    • 2020-10-19
    • 2011-10-21
    • 2019-05-19
    • 2011-10-04
    相关资源
    最近更新 更多