如何移除Nextflow channel.fromFilePairs()输出Map键中的_L001_R?
解决Nextflow channel.fromFilePairs()的键名修改问题
问题描述
使用channel.fromFilePairs()时,默认生成的键包含冗余部分:
params.reads = "/path/to/my_reads/sample03_L001_R{1,2}_001.fastq.gz" my_reads_ch = channel.fromFilePairs(params.reads)
输出的键为sample03_L001_R,期望将键修改为sample03(移除_L001_R部分)。
错误原因
尝试用it[0] - /_\w+/修改键名时报错ERROR: Unknown method invocation 'negative' on Pattern type,是因为Groovy中没有定义字符串与正则表达式的减法操作。/_\w+/是Pattern对象,减号操作被解析为调用Pattern的negative()方法,但该方法不存在。
解决方法
可以通过字符串的replaceAll()或split()方法处理键名,以下是两种可行方案:
方案1:使用replaceAll()移除冗余后缀
通过正则匹配并替换掉第一个下划线后的所有内容,适合通用场景:
params.reads = "/path/to/my_reads/sample03_L001_R{1,2}_001.fastq.gz" my_reads_ch = channel.fromFilePairs(params.reads) .map { raw_id, reads -> // 移除第一个下划线后的所有字符,保留前缀作为样本ID def clean_id = raw_id.replaceAll(/_.*/, '') [clean_id, reads] } // 验证结果 my_reads_ch.view()
方案2:使用split()分割字符串取前缀
如果文件名格式固定(下划线分隔),可以直接分割取第一个元素:
params.reads = "/path/to/my_reads/sample03_L001_R{1,2}_001.fastq.gz" my_reads_ch = channel.fromFilePairs(params.reads) .map { raw_id, reads -> // 按下划线分割,取第一个部分作为样本ID def clean_id = raw_id.split('_')[0] [clean_id, reads] } // 验证结果 my_reads_ch.view()
两种方案最终都会输出期望的结果:[sample03, [/path/to/my_reads/sample03_L001_R1_001.fastq.gz, /path/to/my_reads/sample03_L001_R2_001.fastq.gz]]
内容的提问来源于stack exchange,提问作者Samuel Morrison
相关产品推荐
相关产品推荐

