免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3747 | 回复: 9
打印 上一主题 下一主题

用perl除去有交集的行 [复制链接]

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-04-30 21:18 |只看该作者 |倒序浏览
           start        end
a        1        6
a        2        7
a        15        19
a        3        9
a        2        13
a        21        25
b        2        8
b        32        7
b        5        11
b        13        17
b        19        22
..
..
我想输出不含交集的行,即只要数据中行与行的start——end之间有交集,就舍去那些行。想得到如下结果:
a        15        19
a        21        25
b        13        17
b        18        22
..
..
等大神的代码!看能不能尽量省内存~
万谢!!!

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
2 [报告]
发表于 2014-05-01 08:59 |只看该作者
为什么没有给解决的大神啊!!!? 回复 1# 清泉一边


   

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
3 [报告]
发表于 2014-05-02 09:25 |只看该作者
要省内存的话代码可以参考http://bbs.chinaunix.net/thread-4119878-1-2.html这个帖子里我的回复(55楼:http://bbs.chinaunix.net/forum.p ... &fromuid=663671),当然他的需求跟你的不完全一样,你根据我的代码稍稍修改一下就可以了。你要是说对Perl不熟啊什么的(这个论坛很多人这样说),就等其他好心人帮你修改我的代码或者提供新的代码。

论坛徽章:
0
4 [报告]
发表于 2014-05-02 15:30 |只看该作者
本帖最后由 ba_du_co 于 2014-05-02 15:48 编辑

有行 start > end
b        32        7

start < end 的话可以参考
  1. my ( $key, @data ) = '#!/usr/bin/perl';
  2. while (<DATA>) {
  3.     my ( $head, @tail ) = split;
  4.     &Print if @data and ( $head ne $key );
  5.     ( $key, $data[@data] ) = ( $head, [@tail] );
  6. }

  7. &Print;

  8. sub Print {
  9.     @data = sort { $a->[0] <=> $b->[0] } @data;
  10.     my @print = shift @data;
  11.     for my $r ( splice @data ) {
  12.         $r->[0] < $print[-1][-1]
  13.           ? push @{ $print[-1] },
  14.               ( $r->[1], $print[-1][-1] )[ $r->[1] < $print[-1][-1] ]
  15.           : @{ $print[-1] } > 2 ? ( $print[-1] = $r ) : push @print, $r;
  16.     }
  17.     print join( "\t", $key, @$_ ), "\n" for @print;
  18. }

  19. __DATA__
  20. a        1        6
  21. a        2        7
  22. a        15        19
  23. a        3        9
  24. a        2        13
  25. a        21        25
  26. b        2        8
  27. b        32        37
  28. b        5        11
  29. b        13        17
  30. b        19        22
复制代码

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
5 [报告]
发表于 2014-05-06 09:28 |只看该作者
谢谢!!!回复 4# ba_du_co


   

论坛徽章:
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
6 [报告]
发表于 2014-05-06 10:49 |只看该作者

这应该是perl版的月经问题了,最少我看过N次

论坛徽章:
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
7 [报告]
发表于 2014-05-09 15:38 |只看该作者
回复 1# 清泉一边
  1. [root@localhost tmp]# cat a
  2. a        1        6
  3. a        2        7
  4. a        15        19
  5. b        7        32
  6. a        3        9
  7. a        21        25
  8. b        2        8
  9. b        5        11
  10. a        2        13
  11. b        13        17
  12. b        19        22
  13. c        3         5
  14. c        5         7
  15. c        200       400
  16. a        100       120
  17. d        5         9
  18. d        3         5
  19. m        2         5

  20. awk 'NR == FNR{ a[$2" "$3]=$1 }NR>FNR{for(i in a){ flag=0
  21. >
  22. >                if(a[i]==$1){  split(i , m ," ")
  23. >
  24. >                               if ( ($2 >  m[1] && $2 <  m[2]) || ($3 > m[1] && $3 < m[2]) || ($2 <  m[1] && $3 >  m[2]) )
  25. >
  26. >                                     flag = 1     }
  27. >
  28. >                    if (flag) delete a[i]
  29. >                  }}END { for(i in a)print a[i]" "i}' a a
  30. a 100 120
  31. c 200 400
  32. a 15 19
  33. m 2 5
  34. d 3 5
  35. a 21 25
  36. c 5 7
  37. d 5 9
复制代码
如果取决区间无重合,比如1 3和3 5/ 6 8 和8 10 /  7 9和 7 9 ,这个脚本可以解决你的问题。
当然前提是$2<$3,如果不是,也不是什么难题,加个条件就能过滤了。

论坛徽章:
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
8 [报告]
发表于 2014-05-11 10:28 |只看该作者
awk毫无压力,写个区间相交的,比如1 3 和 3 5以及 8 9 和9 10这种。

该脚本前提是第二列<=第三列,若最有这种数据,请自行处理,是舍弃还是交换,比如32 7是舍弃了还是转换为7 32。
  1. [root@221 ~]# cat f
  2. a        1        6
  3. a        2        7
  4. a        15        19
  5. b        27        32
  6. a        3        9
  7. a        21        25
  8. b        2        8
  9. b        5        11
  10. a        2        13
  11. b        13        17
  12. b        19        22
  13. c        3         5
  14. c        5         7
  15. c        200       400
  16. a        100       120
  17. d        5         9
  18. d        3         5
  19. b        15        20
  20. d        500     600
  21. m        2         5
  22. [root@221 ~]# awk 'NR==FNR{a[$1" "$2" "$3]=$1;b[$1]++}NR>FNR{
  23. >
  24. >         counter=0
  25. >      
  26. >         for(i in a)
  27. >
  28. >         {
  29. >
  30. >                 if($1==a[i])
  31. >
  32. >                    {
  33. >
  34. >                      split(i,m," ")
  35. >
  36. >
  37. >                      if($3<m[2] || $2>m[3] || (m[2]==$2 && m[3]==$3))
  38. >
  39. >
  40. >                           counter++
  41. >                                   
  42. >                      else next
  43. >                        
  44. >                           
  45. >                      if(counter == b[$1])
  46. >
  47. >                         print $0
  48. >
  49. >                      }
  50. >
  51. >         }
  52. >
  53. > }' f f
  54. a        15        19
  55. b        27        32
  56. a        21        25
  57. c        200       400
  58. a        100       120
  59. d        500     600
  60. m        2         5
  61. [root@221 ~]#
复制代码

论坛徽章:
0
9 [报告]
发表于 2014-05-16 08:37 |只看该作者
猜猜我是谁

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
10 [报告]
发表于 2014-07-21 10:48 |只看该作者
I don't know~回复 9# 思嘉不丽


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP