免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
31 [报告]
发表于 2014-01-22 15:47 |只看该作者
回复 14# xiumu2280
才看到,马上测试哈!

   

论坛徽章:
0
32 [报告]
发表于 2014-01-22 15:55 |只看该作者
回复 14# xiumu2280
才看到,马上测试哈!

   

论坛徽章:
0
33 [报告]
发表于 2014-01-22 15:58 |只看该作者
回复 14# xiumu2280
碉堡了!但是有一个报错,不知道怎么解决?

   

111.jpg (28.6 KB, 下载次数: 23)

111.jpg

112.jpg (11.59 KB, 下载次数: 28)

112.jpg

论坛徽章:
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
34 [报告]
发表于 2014-01-22 16:12 |只看该作者
这是~~的问题 你的perl是什么版本的··
报错了··真是碉堡了回复 33# felix0608


   

论坛徽章:
0
35 [报告]
发表于 2014-01-22 16:14 |只看该作者
回复 34# xiumu2280


v5.8.8


   

论坛徽章:
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
36 [报告]
发表于 2014-01-22 16:21 |只看该作者
  1. grep {$hash_NB{$_}}@{$hash_goal{$zone}}
复制代码
可以改成这样

论坛徽章:
0
37 [报告]
发表于 2014-01-22 16:38 |只看该作者
回复 36# xiumu2280


你的代码我测试了。不是我想要的结果哦。我是以第一个文件作为大集合,求第二个文件的补集。你的结果是两个文件没有交际的行。


   

论坛徽章:
0
38 [报告]
发表于 2014-01-22 16:46 |只看该作者
回复 36# xiumu2280

大神你好:我陈述一下我的目的:
file1:
scaffold1       1       16439
scaffold1       18075   18656
scaffold1       22506   22691
scaffold1       53109   55597
scaffold1       64277   76351
scaffold1       84997   85240
scaffold1       91210   98127
scaffold1       98569   99022
scaffold1       101188  102851
scaffold1       105232  105249
scaffold1       113602  116343
scaffold1       124999  125184
scaffold1       125930  126558
scaffold1       134339  134668
scaffold1       141085  141482
scaffold1       141576  142066
scaffold1       142183  142295
scaffold1       142368  142817
scaffold1       143613  145919
scaffold1       146106  146119
scaffold1       146456  146501
scaffold1       147426  147715
scaffold1       148846  149512
scaffold1       149776  149813
scaffold1       150361  150747
scaffold1       158353  160761
scaffold1       165280  165383
scaffold1       165486  165737
scaffold1       166810  173128
scaffold1       174606  175266
scaffold1       176688  179222
scaffold1       183911  184183
scaffold1       186787  188238
scaffold1       190183  191560
scaffold1       192206  195941
scaffold1       202089  202265
scaffold1       202944  203048
scaffold1       208786  208979
scaffold1       211069  211420
scaffold1       212044  212069
scaffold1       217631  217813
scaffold1       218313  219423
scaffold1       222785  226870
scaffold1       235200  245644
scaffold1       258071  260210
scaffold1       260446  260450
scaffold1       260660  261439
……

file2:

scaffold1       1       244
scaffold1       291     675
scaffold1       719     1026
scaffold1       1113    1329
scaffold1       1332    1646
scaffold1       1653    1910
scaffold1       2034    2284
scaffold1       2511    2671
scaffold1       3006    3126
scaffold1       3845    3944
scaffold1       3947    4079
scaffold1       4173    4352
scaffold1       5020    5125
scaffold1       5130    5229
scaffold1       5968    6132
scaffold1       7599    7702
scaffold1       8314    8580
scaffold1       8657    8813
scaffold1       9156    9376
scaffold1       9725    11199
scaffold1       11206   13848
scaffold1       13881   13980
scaffold1       13986   14148
scaffold1       14173   14475
scaffold1       14759   15304
scaffold1       15429   15606
scaffold1       15692   15797
scaffold1       15898   16171
scaffold1       16863   16981
scaffold1       18656   18756
scaffold1       18845   18949
scaffold1       19167   19272
scaffold1       20314   20413
scaffold1       20431   20542
scaffold1       20692   20791
scaffold1       20810   20918
scaffold1       21789   21906
scaffold1       21945   22461
scaffold1       22526   22776
scaffold1       22846   23126
scaffold1       23162   23755
scaffold1       23882   24047
scaffold1       24714   24813
scaffold1       24974   25204
scaffold1       25293   25726
scaffold1       25729   25828
scaffold1       25833   26030
scaffold1       26105   26341
……


两个文件都是三列:第一列是ID,不止是scaffold1,还有100多个呢!第二列是坐标起点,第三列是坐标的终点。
我的目的是这样的:以第一个文件作为参考系。如果第二个文件中的坐标范围落在第一个相同ID的某一段的话,就把那一段坐标从第一个文件中去除。

比如前面几列的结果是这样的:
scaffold1 245 290
scaffold1 676 718
scaffold1 1027 1112
……
scaffold1 16172   16439(这个坐标是第一个文件第一列的终点,接下来的又以文件一的第二行作为坐标。)


实现起来好像挺麻烦的,谢啦!!








   

论坛徽章:
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
39 [报告]
发表于 2014-01-22 18:19 |只看该作者
{:2_172:} 看明白你的问题了, 但是不会写。我觉得比较茫然。 等待大神 xiumu2280。




回复 38# felix0608


   

论坛徽章:
0
40 [报告]
发表于 2014-01-22 23:45 |只看该作者
写了个除交集的子程序,大家测试下!
#!/usr/bin/perl
use strict;
use warnings;
sub get_intersection{
#        my ($s1,$e1,$s2,$e2)=@_;传递四个坐标作为参数
        if ($_[1]<$_[2] || $_[0]>$_[3]) {
                print "无交集!\n";
                return ();
        }else{
                @_=sort {$a<=>$b} @_;
                my @inter=($_[1],$_[2]);
                delete_repeat(@inter);
        }
}

sub delete_repeat{
        my %h;
        @h{@_}=1;
        my @collet=sort {$a<=>$b} keys %h;
}

sub cut_intersection{
        my @a=($_[0],$_[1]);
        my @b=($_[2],$_[3]);
        my @cut;
        my @inter =get_intersection(@a,@b);
        if (scalar @inter==1) {
                $inter[0]==$a[0] ? do{ @cut=($a[0]+1,$a[1])} : do{ @cut=($a[0],$a[1]-1)};

        }elsif(scalar @inter==0){@cut=@a;}
         else{
                                if($inter[0]>$a[0] && $inter[1]<$a[1]){
                                        @cut=([$a[0],$inter[0]-1],[$inter[1]+1,$a[1]]);
                                        @cut=map {my @n=@$_;[delete_repeat(@n)]}@cut;

                                }
                                elsif($inter[0]>$a[0] && $inter[1]==$a[1]){
                                        @cut=($a[0],$inter[0]-1);
                                        @cut=delete_repeat(@cut)
                                }
                                elsif($inter[0]==$a[0] && $inter[1]<$a[1]){
                                        @cut=($inter[1]+1,$a[1]);
                                        @cut=delete_repeat(@cut)

                                }
                                elsif($inter[0]==$a[0] && $inter[1]==$a[1]){
                                        @cut=();
                                }
         }
         
return @cut;
}


my @a=(9,20);my @b=(14,19);
print map {"$_\t"}get_intersection(@a,@b);
print "\n------\n";
print  map {"@$_\t"} cut_intersection(@a,@b);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP