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

如何按chr和start列合并多个.bed文件并以文件名作为新增列名

按chr和start合并多个BED文件并以文件名作为列名

我需要依据前两列chr和start合并多个.bed文件,现有AWK脚本能实现合并并将空值替换为0,但希望把文件名作为新增列的列名。

现有脚本

combineFWPS_02.sh

BEGIN {
   for (k=1; k<ARGC; ++k)
      s = s " " 0
}
FNR == 1 {
   ++ARGIND
}
{
   key=$1 OFS $2
   if (!(key in map))
      map[key] = s
   split(map[key], a)
   a[ARGIND] = $3
   v = ""
   for (k=1; k<ARGC; ++k)
      v = v " " a[k]
   map[key]=v
}
END {
   for (k in map)
      print k map[k]
}

comRwps_02.sh

awkCOM="~/scripts/combineFWPS_02.sh"
## Run the jobs
time awk -f $awkCOM *.xyz.bed | sort -k1 >  13jLiC.xyz.txt 

输入文件示例

FF85561.xyz.bed:
chr1 111001 234
chr2 22099  108
chr5 463100 219

FF85574.xyz.bed:
chr1 111001 42
chr1 430229 267
chr5 663800 319

FF85631.xyz.bed:
chr1 111001 92
chr3 22099  144
chr5 663800 311

FF85717.xyz.bed:
chr1 111001 129
chr1 157901 79
chr2 22099  442

期望输出格式

$head 13jLiC.xyz.txt
chr    start    FF85561    FF85574    FF85631    FF85717
chr1   111001    234         42          92         129
chr1   157901      0          0           0          79
chr1   430229      0        267           0           0
chr2    22099    108          0           0         442
chr3    22099      0          0         144           0
chr5   463100    219          0           0           0
chr5   663800      0        319         311           0

修改后的解决方案

要实现将文件名作为列名,需修改原AWK脚本,新增文件名收集、表头输出逻辑,同时优化输出格式:

修改后的combineFWPS_02.sh

BEGIN {
    # 收集输入文件名并去除后缀
    for (k=1; k<ARGC; k++) {
        fname = ARGV[k]
        sub(/\.xyz\.bed$/, "", fname)
        headers[k] = fname
        # 初始化默认值为0的字符串
        s = s "\t0"
    }
    OFS = "\t"  # 用制表符分隔保证输出对齐
}

FNR == 1 {
    file_idx = ARGIND
}

{
    key = $1 OFS $2
    if (!(key in map)) {
        map[key] = s
    }
    split(map[key], vals, "\t")
    vals[file_idx] = $3
    # 重新拼接值字符串
    new_vals = ""
    for (k=1; k<ARGC; k++) {
        new_vals = new_vals OFS vals[k]
    }
    map[key] = new_vals
}

END {
    # 输出表头
    print "chr" OFS "start" OFS headers[1] OFS headers[2] OFS headers[3] OFS headers[4]
    # 按chr和start升序输出结果
    PROCINFO["sorted_in"] = "@ind_str_asc"
    for (key in map) {
        print key map[key]
    }
}

修改后的运行脚本comRwps_02.sh

awkCOM="~/scripts/combineFWPS_02.sh"
## Run the jobs
time awk -f $awkCOM *.xyz.bed > 13jLiC.xyz.txt

注:修改后的脚本已内置排序逻辑,无需额外通过sort命令处理。

修改后脚本会自动提取每个输入文件的前缀作为列名,输出带表头的规整结果,空值自动填充为0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:27:04