You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:35:28