第2/3列为起始坐标,当他们第五列相同时,比较第二第三列,如果坐标区间有重叠,则合并之并取其最小的起始坐标和最大的终止坐标,并对处理后的数据进行排序,在第五列字符串后加上号码.
refseq1 860921 861380 + NM_152486 SAMD11
refseq1 861102 861593 + NM_152486 SAMD11
refseq1 865335 865916 + NM_152486 SAMD11
refseq1 866219 866669 + NM_152486 SAMD11
问题可以简化为,当某一列相同的时候,$2/$3(区间有交集)那么取其起始值。
首先sort -k5 -k2以第5列为准,$2升序,然后:
awk -v OFS="\t" 'NR==1{tag=$5;start=$2;end=$3;a=$6;b=$4;c=$1}NR>1{
if($5==tag){
if($2
end)
end=$3 # e.g NR==1($2/$3为1-10,下一行是5-15,此时应该合并为1-15,所以end=$3
else if ($3
else{ # $5不同,打印,且重新赋值。
print ">"tag"_"++count,a,c,b,start,end;
start=$2;end=$3
}
}
else {
print ">"tag"_"++count,a,c,b,start,end;
tag=$5;start=$2;end=$3;a=$6;b=$4;c=$1
count=0
}
}END{print ">"tag"_"++count,a,c,b,start,end}'
更多讨论
补充一下,简单的合并比如
a 1 5
a 2 7
...这种合并,
首先排序,sort -k2n file
然后逐行比较,思路一样。
awk 'NR==1{start=$2;end=$3}NR>1{
if($2>end){print $1,start,end;start=$2;end=$3}
else if ($2end)end=$3
else next
}END{print $1,start,end}'
#这里next没什么意义,只是为了满足awk的条件语句的结构,其实2个if,不用else就不用这个next了,也就是if没有$3
阅读(4746) | 评论(0) | 转发(0) |