Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1068688
  • 博文数量: 186
  • 博客积分: 4939
  • 博客等级: 上校
  • 技术积分: 2075
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-08 17:15
文章分类

全部博文(186)

文章存档

2018年(1)

2017年(3)

2016年(11)

2015年(42)

2014年(21)

2013年(9)

2012年(18)

2011年(46)

2010年(35)

分类: LINUX

2013-09-23 17:21:00

第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($2end)

                                                           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

阅读(4667) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~