免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: huang6894
打印 上一主题 下一主题

[文本处理] 对重叠区间交集进行合并处理 [复制链接]

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
11 [报告]
发表于 2013-09-13 17:19 |只看该作者
回复 9# expert1


    感谢!

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
12 [报告]
发表于 2013-09-13 23:37 |只看该作者
本帖最后由 cao627 于 2013-09-13 23:38 编辑

@jason680

  1. $ cat file1
  2. a 2 7
  3. a 4 9
  4. A 2 7
  5. A 4 6

  6. $ awk '{k=$1""$2;for(n=0;n++<3;)a[k,n]=$n;c[k]}END{$1="";t=asorti(c,s);for(n=0;n++<t+1;){N=s[n];if($1==a[N,1]&&$3>=a[N,2])a[N,2]=$2;else if($1)print $1,$2,$3;for(m=0;m++<3;)$m=a[N,m]}}' file1
  7. A 2 6  #A 2 7
  8. a 2 9
复制代码

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
13 [报告]
发表于 2013-09-13 23:47 |只看该作者
居然还真有一群夜猫。
本猫可要睡了,终于可以睡了。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
14 [报告]
发表于 2013-09-14 12:07 |只看该作者
回复 12# cao627

Here you are

$ awk '{k=$1""$2;for(n=0;n++<3;)a[k,n]=$n;c[k]}END{$1="";t=asorti(c,s);for(n=0;n++<t+1;){N=s[n];if($1==a[N,1]&&$3>=a[N,2]){a[N,2]=$2;if($3>a[N,3])a[N,3]=$3}else if($1)print $1,$2,$3;for(m=0;m++<3;)$m=a[N,m]}}' file1
A 2 7
a 2 9

   

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
15 [报告]
发表于 2013-09-15 12:20 |只看该作者
回复 12# cao627


    你这种情况和

http://bbs.chinaunix.net/thread-3620300-2-1.html

很相似啊,但这里是升序排列的。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
16 [报告]
发表于 2013-09-16 16:13 |只看该作者
回复 8# jason680


    求解释一下。看的费力啊。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
17 [报告]
发表于 2013-09-17 09:51 |只看该作者
回复 16# expert1

# awk '{
  k=sprintf("%s_%020d",$5,$2);  # for key
  for(n=0;n++<6;)a[k,n]=$n;     
  c[k]                          
  }
  END{
    $5="";
        t=asorti(c,s);                                # sort all data
        for(n=0;n++<t+1;){
          N=s[n];
          if($5==a[N,5]&&$3+1>=a[N,2])     # check overlay area
            a[N,2]=$2;                     # keep the minimum value
          else if($5)
            print ">"$5"_E"++C,$6,$1,$4,$2,$3;
          if($5!=a[N,5]) C=0;              # reset count
          for(m=0;m++<6;)                  # save last data in $1, $2, $3, ...
            $m=a[N,m]
        }
}' FILE

for example
sorted data
refseq1 860921  861380  +       NM_152486       SAMD11  <== last , $1,$2,...
refseq1 861102  861593  +       NM_152486       SAMD11  <== Now  , a[N,1], a[N,2],...

if($5==a[N,5]&&$3+1>=a[N,2])
  $5==a[N,5] is true   , the $5(NM_152486) are the same
  $3+1>=a[N,2] is true , 861380 > 861102
   the end of last one is bigger than start of next one (Now)
   to keep start value of the "last"
   by a[N,2]=$2;
Note: there hav a bug that didn't check $3 for maximum value


refseq1 879088  880161  +       NM_152486       SAMD11  <== last , $1,$2,...
refseq1 935046  935752  -       NM_021170       HES4    <== Now  , a[N,1], a[N,2],...

if($5==a[N,5]&&$3+1>=a[N,2])
$5==a[N,5] is false
and ouput the "last" data with count
else if($5)
    print ">"$5"_E"++C,$6,$1,$4,$2,$3;

  the $5 are different and reset count
  if($5!=a[N,5]) C=0;              # reset count   
   

评分

参与人数 1可用积分 +5 收起 理由
expert1 + 5 很给力!

查看全部评分

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
18 [报告]
发表于 2013-09-17 11:44 |只看该作者
回复 17# jason680


    print ">"$5"_E"++

他这个规则咋算的? 第5列相等一次,++一次吗,?第一次是1,然后第二次相等就2,以此类推?

还有貌似他的数据没得什么规律,只是起始数据$2<$3,貌似你这个有bug,没有判断正确,

$ awk '{k=sprintf("%s_%020d",$5,$2);for(n=0;n++<6a[k,n]=$n;c[k]}END{$5="";t=asorti(c,s);for(n=0;n++<t+1{N=s[n];if($5==a[N,5]&&$3+1>=a[N,2])a[N,2]=$2;else if($5)print ">"$5"_E"++C,$6,$1,$4,$2,$3;if($5!=a[N,5])C=0;for(m=0;m++<6$m=a[N,m]}}' <<<"refseq2 87813  88508  -       NM_001002919    FAM150B
> refseq2 87383  88092  -       NM_001002919    FAM150B
> refseq2 86090  86543  -       NM_001002919    FAM150B
> refseq2 85923  86403  -       NM_001002919    FAM150B
> refseq2 82911  89375  -       NM_001002919    FAM150B
> refseq2  63  280352  -        NM_001002919    FAM150B"
>NM_001002919_E1 FAM150B refseq2 - 63 86543
>NM_001002919_E2 FAM150B refseq2 - 87383 88508

按理应该是63---280352才对。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
19 [报告]
发表于 2013-09-17 12:16 |只看该作者
本帖最后由 jason680 于 2013-09-17 12:17 编辑

回复 18# expert1

1. ++ is for C variable
   print ">"$5"_E"++C   

2. thank you for notice again with bug
  I said it had the bug in 16L(2013-09-17 09:51:26)
  ca0627 said it had some bug in 11L and I solved issue in 13L
  

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
20 [报告]
发表于 2013-09-17 15:31 |只看该作者
本帖最后由 expert1 于 2013-09-17 15:32 编辑

回复 19# jason680


    你这个针对cao627的fix. 好像考虑的还是不全,这种问题是非常麻烦的,想了半天都没什么好的思路。

awk '{k=$1""$2;for(n=0;n++<3a[k,n]=$n;c[k]}END{$1="";t=asorti(c,s);for(n=0;n++<t+1{N=s[n];if($1==a[N,1]&&$3>=a[N,2]){a[N,2]=$2;if($3>a[N,3])a[N,3]=$3}else if($1)print $1,$2,$3;for(m=0;m++<3$m=a[N,m]}}' <<<"
> A 10 30
> A 20 40
> A 50 70
> A1 38 168"
A 10 30
A1 38 168
A 20 40
A 50 70


我这里是gawk.

按理10-30,20-40应该合并为10-40才对。

这个可以简化为,三个字段,在第一个字段相等的情况下,找出最小/最大坐标($2<$3,这个应该可以肯定),但数据都没什么顺序和规律($2,$3不是有规律的排序过的)



您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP