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

如何修改Awk脚本以仅生成文件的二元组合而非全部组合?

修改方案

问题出在脚本的END块循环逻辑——当前代码会遍历从输入文件总数到2的所有组合长度(r值),因此会生成所有长度的组合(比如你示例里的三元组合)。只需要固定生成r=2的二元组合即可,修改步骤如下:

  1. 删掉END块里的for (r=NR; r>=2; r--)循环,直接设置r=2
  2. 保留后续的delete B、get_combs(A,B)等逻辑

修改后的完整脚本:

function get_combs(A,B, i,n,comb) {
    n = length(A)
    if (r=="") r = 2

    comb = ""
    for (i=1; i <= r; i++) {
        indices[i] = i
        comb = (i>1 ? comb OFS : "") A[indices[i]]
    }
    B[comb]

    while (indices[1] < n - r + 1) {
        for (i = r; i >= 1; i--) {
            if (indices[i] < n - r + i) {
                indices[i]++
                  p = i
                break}}
        for (i = p + 1; i <= r; i++) indices[i] = indices[i - 1] + 1

        comb = ""
        for (i=1; i <= r; i++) {
            comb = (i>1 ? comb OFS : "") A[indices[i]]
        }
        B[comb]
    }
}

{ A[NR] = $0 }
END {
    OFS = "\t"
    r = 2  # 固定生成二元组合
    delete B
    get_combs(A,B)
    PROCINFO["sorted_in"] = "@ind_str_asc"
    for (comb in B) {
        print comb
    }
}

执行原命令awk -f combos.awk <(ls *pileup)后,输出就会只包含你需要的二元组合:

348-34_control_MO.sorted.bam.pileup 577_MO.sorted.bam.pileup
348-34_control_MO.sorted.bam.pileup 822_MO1.sorted.bam.pileup
577_MO.sorted.bam.pileup    822_MO1.sorted.bam.pileup

内容的提问来源于stack exchange,提问作者garcesj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:45:19