免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
41 [报告]
发表于 2014-01-23 20:21 |只看该作者
本帖最后由 jason680 于 2014-01-23 20:24 编辑

回复 26# felix0608

$ perl remove_over.pl
scaffold1        245        290
scaffold1        676        718
scaffold1        1027        1112
...
scaffold1        260446        260450
scaffold1        260660        261439

$ cat remove_over.pl
  1. use strict;
  2. use warnings;

  3. my $DEBUG = 0;
  4. my $sFile_data = "file1";
  5. my $sFile_over = "file2";

  6. open( my $FHdata, "<", $sFile_data) or die "cannot open $sFile_data\n";
  7. open( my $FHover, "<", $sFile_over) or die "cannot open $sFile_over\n";

  8. sub DBGprint{ print "  >>> DEBUG: @_" if $DEBUG};


  9. sub get_next{
  10.   my ($FH) = @_;
  11.   my $sLine = <$FH>;
  12.   if(! defined $sLine){
  13.     DBGprint "cannot read file\n";
  14.     return;
  15.     exit;
  16.   }
  17.   chomp $sLine;
  18.   my @aRet = split(/\s+/,$sLine);
  19.   DBGprint "get_next, @aRet\n";
  20.   return @aRet;
  21. }
  22. sub Xprint{
  23.   my( $sId, $sStart, $sEndof) = @_;
  24.   print "$sId\t$sStart\t$sEndof\n";
  25. }
  26. sub remove_over(++){
  27.   my ($raData, $raOver) = @_;
  28.   DBGprint "data=@{$raData}, Over=@{$raOver} \n";

  29.   exit if(! defined $raData->[0]);
  30.   if(! defined $raOver->[0]){
  31.     Xprint @{$raData};
  32.     return(1,0);
  33.   }
  34.   # ID different
  35.   # Data: scaffold1  ss xx
  36.   # Over: scaffold2  tt yy
  37.   if( $raData->[0] ne $raOver->[0]){
  38.     Xprint @{$raData};
  39.     return (1,0);
  40.   }
  41.   
  42.   # ID same

  43.   # Data: scaffold1  1 15
  44.   if($raData->[1] == $raOver->[1]){
  45.     # Over: scaffold1  1 15
  46.     return(1,1) if ($raData->[2] == $raOver->[2]);

  47.     # Over: scaffold1  1 20
  48.     return(1,0) if ($raData->[2] <  $raOver->[2]);
  49.    
  50.     # Data: scaffold1  1  15
  51.     # Over: scaffold1  1  13
  52.     # change Data start to 14 (Note: 13 + 1)
  53.     $raData->[1] = $raOver->[2]+1;
  54.     # Data: scaffold1  14 15
  55.     # and read Over file
  56.     return(0,1);
  57.   }

  58.   # Over start is more Data start
  59.   # Data: scaffold1  1  xx
  60.   # Over: scaffold1  10 yy
  61.   if($raData->[1] < $raOver->[1]){
  62.    
  63.     # Data: scaffold1  1  15
  64.     if($raData->[2] < $raOver->[1]){
  65.       # Over: scaffold1  20 yy
  66.       # Output: scaffold1 1 15
  67.       Xprint($raData->[0], $raData->[1], $raData->[2]);
  68.       return(1,0);
  69.     }
  70.     if($raData->[2] == $raOver->[1]){
  71.       # Over: scaffold1  15 yy
  72.       # Output: scaffold1 1 14
  73.       Xprint($raData->[0], $raData->[1], $raData->[2] -1);
  74.       return(1,0);
  75.     }

  76.     # Data: scaffold1  1  15
  77.     # Over: scaffold1  10 yy
  78.     # Output: scaffold1 1 9
  79.     Xprint($raData->[0], $raData->[1], $raOver->[1]-1);

  80.     # Over: scaffold1  10 15
  81.     return(1,1) if ($raData->[2] == $raOver->[2]);

  82.     # Over: scaffold1  10 20
  83.     return(1,0) if ($raData->[2] <  $raOver->[2]);

  84.     # Data: scaffold1  1  15
  85.     # Over: scaffold1  10 13
  86.     # change Data start to 14 (Note: 13 + 1)
  87.     $raData->[1] = $raOver->[2]+1;
  88.     # Data: scaffold1  14 15
  89.     # and read Over file
  90.     return(0,1);
  91.   }
  92.   
  93.   # Data: scaffold1  3  xx
  94.   # Over: scaffold1  1  3
  95.   if($raData->[1] == $raOver->[2]){
  96.     $raData->[1] = $raOver->[2] + 1;
  97.     return(0,1);
  98.   }
  99.   if($raData->[1] < $raOver->[2]){
  100.     # Data: scaffold1  3  10
  101.     # Over: scaffold1  1  13
  102.     if($raData->[2] < $raOver->[2]){
  103.       return(1,0);
  104.     }

  105.     # Data: scaffold1  3  10
  106.     # Over: scaffold1  1  5
  107.     $raData->[1] = $raOver->[2] + 1;
  108.   }
  109.   return(0,1);
  110. }
  111. sub FLGprint{
  112.   my ($sFlg, $sMesg) = @_;
  113.   DBGprint "$sMesg" if $sFlg;
  114. }

  115. $DEBUG=1 if(@ARGV >=1 && $ARGV[0] eq '-d');
  116. my $sRead_data = 1;
  117. my $sRead_over = 1;
  118. my (@aData, @aOver);
  119. my $sCnt = 0;
  120. while(1){
  121.     $sCnt++;
  122.     DBGprint "Cycle: $sCnt\n";
  123.     FLGprint $sRead_data, "Read Data\n";
  124.     @aData = get_next($FHdata) if($sRead_data == 1);
  125.     FLGprint $sRead_over, "Read Over\n";
  126.     @aOver = get_next($FHover) if($sRead_over == 1);
  127.     ($sRead_data, $sRead_over) = remove_over(@aData, @aOver);
  128.     #exit if($sCnt > 500);
  129. }
复制代码

论坛徽章:
0
42 [报告]
发表于 2014-01-23 20:43 |只看该作者
回复 1# felix0608


    给你个思路,去寻找一个叫做 并查集 的算法,可以满足你

论坛徽章:
8
技术图书徽章
日期:2013-09-30 08:51:28技术图书徽章
日期:2013-12-11 09:26:39白羊座
日期:2013-12-27 15:27:13金牛座
日期:2014-01-06 09:13:05天蝎座
日期:2014-01-21 14:23:28酉鸡
日期:2014-05-09 16:51:12卯兔
日期:2014-08-11 16:49:1515-16赛季CBA联赛之八一
日期:2017-08-14 23:24:57
43 [报告]
发表于 2014-01-23 21:52 |只看该作者
本帖最后由 xiumu2280 于 2014-01-23 21:53 编辑
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. open (FILE1,"C:\\Users\\Desktop\\Test\\2014_1_23\\file1.txt");
  5. open (FILE2,"C:\\Users\\Desktop\\Test\\2014_1_23\\file2.txt");
  6. open (OUT,">C:\\Users\\Desktop\\Test\\2014_1_23\\11.txt");

  7. my %hash_group;
  8. map {
  9.         chomp;
  10.         my ($key,$start,$end) = split;
  11.         push @{$hash_group{$key}},($start..$end)
  12. }<FILE2>;


  13. while (<FILE1>) {
  14.         chomp;
  15.         my ($key,$start,$end) = split;
  16.         my %uniq;
  17.         @uniq{@{$hash_group{$key}}}=@{$hash_group{$key}};
  18.         my @data =sort {$a <=> $b} grep {!$uniq{$_}}($start..$end);
  19.         my @zone;
  20.         map {
  21.                 my $n = $_;
  22.                 $n == 0 && push @zone,$data[$n];
  23.                 $n+1<=$#data && $data[$n+1]-$data[$n]>1 && push @zone,($data[$n],$data[$n+1]);
  24.                 $n==$#data && push @zone,$data[-1];
  25.         }0..$#data;

  26.         for (1..($#zone+1)) {
  27.                 $_%2
  28.                         ? print OUT "$key\t$zone[$_-1]\t"
  29.                         : print OUT "$zone[$_-1]\n";
  30.         }
  31. }
复制代码
楼主来一发试试

论坛徽章:
8
技术图书徽章
日期:2013-09-30 08:51:28技术图书徽章
日期:2013-12-11 09:26:39白羊座
日期:2013-12-27 15:27:13金牛座
日期:2014-01-06 09:13:05天蝎座
日期:2014-01-21 14:23:28酉鸡
日期:2014-05-09 16:51:12卯兔
日期:2014-08-11 16:49:1515-16赛季CBA联赛之八一
日期:2017-08-14 23:24:57
44 [报告]
发表于 2014-01-23 21:53 |只看该作者
  1. scaffold1        245        290
  2. scaffold1        676        718
  3. scaffold1        1027        1112
  4. scaffold1        1330        1331
  5. scaffold1        1647        1652
  6. scaffold1        1911        2033
  7. scaffold1        2285        2510
  8. scaffold1        2672        3005
  9. scaffold1        3127        3844
  10. scaffold1        3945        3946
  11. scaffold1        4080        4172
  12. scaffold1        4353        5019
  13. scaffold1        5126        5129
  14. scaffold1        5230        5967
  15. scaffold1        6133        7598
  16. scaffold1        7703        8313
  17. scaffold1        8581        8656
  18. scaffold1        8814        9155
  19. scaffold1        9377        9724
  20. scaffold1        11200        11205
  21. scaffold1        13849        13880
  22. scaffold1        13981        13985
  23. scaffold1        14149        14172
  24. scaffold1        14476        14758
  25. scaffold1        15305        15428
  26. scaffold1        15607        15691
  27. scaffold1        15798        15897
  28. scaffold1        16172        16439
  29. scaffold1        18075        18655
  30. scaffold1        22506        22525
  31. scaffold1        53109        55597
  32. scaffold1        64277        76351
  33. scaffold1        84997        85240
  34. scaffold1        91210        98127
  35. scaffold1        98569        99022
  36. scaffold1        101188        102851
  37. scaffold1        105232        105249
  38. scaffold1        113602        116343
  39. scaffold1        124999        125184
  40. scaffold1        125930        126558
  41. scaffold1        134339        134668
  42. scaffold1        141085        141482
  43. scaffold1        141576        142066
  44. scaffold1        142183        142295
  45. scaffold1        142368        142817
  46. scaffold1        143613        145919
  47. scaffold1        146106        146119
  48. scaffold1        146456        146501
  49. scaffold1        147426        147715
  50. scaffold1        148846        149512
  51. scaffold1        149776        149813
  52. scaffold1        150361        150747
  53. scaffold1        158353        160761
  54. scaffold1        165280        165383
  55. scaffold1        165486        165737
  56. scaffold1        166810        173128
  57. scaffold1        174606        175266
  58. scaffold1        176688        179222
  59. scaffold1        183911        184183
  60. scaffold1        186787        188238
  61. scaffold1        190183        191560
  62. scaffold1        192206        195941
  63. scaffold1        202089        202265
  64. scaffold1        202944        203048
  65. scaffold1        208786        208979
  66. scaffold1        211069        211420
  67. scaffold1        212044        212069
  68. scaffold1        217631        217813
  69. scaffold1        218313        219423
  70. scaffold1        222785        226870
复制代码

论坛徽章:
0
45 [报告]
发表于 2014-01-23 22:03 |只看该作者
回复 42# 一个人取暖
看了下并查集的介绍,是实现将元素归类并快速查找的高效算法;
而楼主是想要将两个集合比较,除去交集,得到补集的高效算法。

   

论坛徽章:
8
技术图书徽章
日期:2013-09-30 08:51:28技术图书徽章
日期:2013-12-11 09:26:39白羊座
日期:2013-12-27 15:27:13金牛座
日期:2014-01-06 09:13:05天蝎座
日期:2014-01-21 14:23:28酉鸡
日期:2014-05-09 16:51:12卯兔
日期:2014-08-11 16:49:1515-16赛季CBA联赛之八一
日期:2017-08-14 23:24:57
46 [报告]
发表于 2014-01-23 22:41 |只看该作者
大神,学习了···
这才是专业的
真心太厉害!!!!
回复 41# jason680


   

论坛徽章:
0
47 [报告]
发表于 2014-01-23 22:56 |只看该作者
大神们都很犀利,jason是术业有专攻啊,工作语言主要是perl吗?

论坛徽章:
0
48 [报告]
发表于 2014-01-24 13:25 |只看该作者
回复 45# jzp520520


    再去好好看吧

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
49 [报告]
发表于 2014-01-25 17:23 |只看该作者
请问大大, 我没想明白这个问题的是怎么使用 并查集 的算法。
请大大指点。
{:2_172:} 感激
一个人取暖 发表于 2014-01-23 13:43
回复 1# felix0608

论坛徽章:
0
50 [报告]
发表于 2014-01-26 14:00 |只看该作者
Is it what you want?

#!/usr/bin/perl -w

use strict;

open F1, '<file1' or die "Can't open file: $!\n";
open F2, '<file2' or die "Can't open file: $!\n";
open OUT, '>output' or die "Can't open file: $!\n";


my %f2_ha;

while (<F2>) {
        my ($x, $y) = (split)[1,2];
        $f2_ha{$x} = $y;        # dup data will be overridden as we don't care.
}

while (<F1>) {
        my ($name, $x,$y) = split;
        next if ( exists $f2_ha{$x} && $f2_ha{$x} eq $y );

        print OUT $_;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP