如何在Nextflow中按规则合并多输出文件块为对应性状单一文件?
解决方案
先从文件路径中解析出性状、染色体、chunk编号等元数据,再按性状分组,组内按染色体和chunk排序后完成合并:
// 假设你的transpose结果通道为以下形式 Channel .from( ["chr1", "/path/to/chr1_chunk1.TC.linear"], ["chr1", "/path/to/chr1_chunk1.HDL.linear"], ["chr1", "/path/to/chr1_chunk2.TC.linear"], ["chr1", "/path/to/chr1_chunk2.HDL.linear"], ["chr2", "/path/to/chr2_chunk1.TC.linear"], ["chr2", "/path/to/chr2_chunk1.HDL.linear"] ) .map { chr, file -> // 用正则从文件名提取chunk编号和性状 def match = file =~ /chr\d+_chunk(\d+)\.(\w+)\.linear/ def chunk_num = match[0][1] as Integer def trait = match[0][2] // 组装包含元数据的映射,方便后续分组排序 return [ trait: trait, chr: chr, chunk: chunk_num, file: file ] } .groupBy { it.trait } // 按性状分组 .map { trait, entries -> // 组内先按染色体排序,再按chunk编号数值排序(避免字符串排序的异常) def sorted_files = entries.sort { a, b -> int chr_cmp = a.chr <=> b.chr chr_cmp != 0 ? chr_cmp : a.chunk <=> b.chunk }.collect { it.file } return [ trait, sorted_files ] } .process { input: tuple val(trait), path(files) output: path "merged_${trait}.linear" script: """ cat ${files.join(' ')} > merged_${trait}.linear """ }
关键细节说明
- 元数据适配:如果你的文件名格式和示例不同,只需修改
map阶段的正则表达式即可。比如文件名是chr1.chunk1.TC.linear,就把正则调整为chr\d+\.chunk(\d+)\.(\w+)\.linear。 - 排序逻辑:先按染色体名称排序,再按chunk编号的数值排序,避免出现
chunk10排在chunk2前面的字符串排序问题。 - 合并操作:用
cat命令将排序后的文件依次拼接,直接生成对应性状的合并文件。
内容的提问来源于stack exchange,提问作者zillur rahman
相关产品推荐
相关产品推荐

