如何修改Awk脚本以仅生成文件的二元组合而非全部组合?
修改方案
问题出在脚本的END块循环逻辑——当前代码会遍历从输入文件总数到2的所有组合长度(r值),因此会生成所有长度的组合(比如你示例里的三元组合)。只需要固定生成r=2的二元组合即可,修改步骤如下:
- 删掉
END块里的for (r=NR; r>=2; r--)循环,直接设置r=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
相关产品推荐
相关产品推荐

