免费注册 查看新帖 |

Chinaunix

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

求大神帮写一个去除交集的perl脚本!! [复制链接]

论坛徽章:
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
61 [报告]
发表于 2014-05-11 18:16 |只看该作者
本帖最后由 expert1 于 2014-05-12 13:15 编辑
  1. 更多测试数据,
  2. [user@myhost tmp]$ more d

  3. A   1  10000
  4. B   1  10001
  5. B   10001  40000
  6. a   2 5
  7. x  10 10
  8. c 1 3
  9. d 5 6

  10. [user@myhost tmp]$ more c
  11. A   5        55
  12. A   56        56
  13. A   57        57
  14. A   1024        1024
  15. A   1025        1078
  16. A   2047        2047
  17. A   6658        6670
  18. A   6671        6671
  19. B   247        249
  20. B   1024        1078
  21. B   5547        5591
  22. B   15547      25591
  23. a 2 2
  24. a 5 5
  25. b 3 9
  26. c 1 1
  27. d 3 5
  28. x 9 10


  29. awk 'NR == FNR{

  30.                 a[$1" "$2" "$3]=$1 }

  31.         NR>FNR{

  32.                   for(i in a)

  33.                       {   flag=0

  34.                          if(a[i]==$1)

  35.                          {

  36.                          split(i ,b ," ")


  37.                         if($2 <= b[2] && $3 >= b[3])
  38.                                

  39.                                 flag= 1
  40.    

  41.                         if ($2 >b[2] && $3 < b[3] )


  42.                         {  

  43.                                 a[a[i]" "b[2] " "($2 - 1)] =a[i]


  44.                                 a[a[i]" "($3 + 1) " " b[3]] =a[i]


  45.                                 flag=1

  46.                         }


  47.                         if ($2 > b[2] && $2 <= b[3] && $3>=b[3])

  48.                         {

  49.                                 a[a[i]" "b[2] " "($2 - 1)] = a[i]

  50.                                 flag= 1

  51.                         }


  52.                         if ($3 >= b[2] && $3 < b[3] && $2<= b[2])

  53.                         {

  54.                                 a[a[i]" "($3 + 1) " " b[3]] = a[i]

  55.                                 flag= 1

  56.                         }


  57.                            }

  58.                         if (flag)

  59.                                 delete a[i]

  60.                       }

  61.              }

  62. END {

  63.      for(i in a)print  i

  64.    }' f1 f2

复制代码
效率更高m,但如果f1有
a 1 100
a 101 200
那么结果可能有
a 1 100
a 101 X
理想情况下应该是a 1 X这个更合理,

就是连续的没有合并。

论坛徽章:
0
62 [报告]
发表于 2014-05-16 11:59 |只看该作者
本帖最后由 yaozhibing41001 于 2014-05-16 14:42 编辑

回复 61# expert1

这种题目怎能漏了我大python

一,
  1. #! /usr/local/bin/python
  2. import re
  3. # http://bbs.chinaunix.net/thread-4119878-4-1.html
  4. file_a=open(r'C:\Users\Administrator\Desktop\python\e\c.lst').readlines()
  5. file_b=open(r'C:\Users\Administrator\Desktop\python\e\d.lst').readlines()
  6. for name in file_a:
  7.     a=name.replace("\n","")
  8.     x_a=re.sub(" +",",",a).split(",")
  9.     key_a=x_a[0]
  10.     begin_a=int(x_a[1])
  11.     end_a=int(x_a[2])
  12.     key_a_r=range(begin_a,end_a+1)
  13.     y=begin_a
  14.     for name2  in  file_b:
  15.         b=name2.replace("\n","")
  16.         x_b=re.sub(" +",",",b).split(",")
  17.         key_b=x_b[0]
  18.         begin_b=int(x_b[1])
  19.         end_b=int(x_b[2])
  20.         if  key_a == key_b :
  21.             if begin_b > end_a or begin_b <begin_a and end_b < begin_a:
  22.                 continue
  23.             if begin_b > y:
  24.                 print  key_a,y,begin_b-1
  25.             y=end_b+1
  26.     if y <= end_a:
  27.         print  key_a,y,end_a   
复制代码
二。 这种执行太慢了。。。
  1. #! /usr/local/bin/python
  2. import re
  3. # http://bbs.chinaunix.net/thread-4119878-4-1.html
  4. file_a=open(r'C:\Users\Administrator\Desktop\python\e\a.lst').readlines()
  5. file_b=open(r'C:\Users\Administrator\Desktop\python\e\b.lst').readlines()
  6. for name in file_a:
  7.     a=name.replace("\n","")
  8.     x_a=re.sub(" +",",",a).split(",")
  9.     key_a=x_a[0]
  10.     begin_a=int(x_a[1])
  11.     end_a=int(x_a[2])
  12.     key_a_r=range(begin_a,end_a+1)
  13.     for name2  in  file_b:
  14.         b=name2.replace("\n","")
  15.         x_b=re.sub(" +",",",b).split(",")
  16.         key_b=x_b[0]
  17.         begin_b=int(x_b[1])
  18.         end_b=int(x_b[2])
  19.         if  key_a == key_b :           
  20.             for key_b_k in range(begin_b,end_b+1):
  21.                 try:
  22.                     key_a_r.remove(key_b_k)
  23.                 except ValueError:
  24.                     continue
  25.     if len(key_a_r)>1:
  26.         x=key_a_r[0]
  27.     for y in  key_a_r:
  28.         if y-1 not in key_a_r:
  29.             a=y
  30.         while y+1 in key_a_r :               
  31.             y=y+1
  32.             key_a_r.remove(y)      
  33.         print key_a,a,y              
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP