如何按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
相关产品推荐
相关产品推荐

