问题描述
我是 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()