免费注册 查看新帖 |

Chinaunix

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

20积分悬赏,求个perl程序,新手,写了好几个都无果。 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-03-28 08:58 |只看该作者
回复 9# blackfur

意思就是ref中的红色区间包含lnc那个红色区间啊。其实就是两个相同的染色体随机切割后。有的会没有交集,有的有,有的一条包含在另一条内。

   

论坛徽章:
0
12 [报告]
发表于 2013-03-28 09:02 |只看该作者
回复 9# blackfur
楼下正解啊


   

论坛徽章:
0
13 [报告]
发表于 2013-03-28 09:27 |只看该作者
昨晚写的那个程序忘了三行,结果漏掉了一点没有交集的行。修改如下:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my (%ref, %data);

  5. open my $in , '<', 'refGene.txt'
  6.     or die "Can't open 'refGene.txt' for reading. $!\n";
  7. while (<$in>) {
  8.     chomp;
  9.     my @t = split;
  10.     push @{$ref{$t[1]}}, [@t];
  11. }
  12. close $in;

  13. open $in , '<', 'lncipedia_location.txt'
  14.     or die "Can't open 'lncipedia_location.txt' for reading. $!\n";
  15. while (<$in>) {
  16.     chomp;
  17.     my @t = split;
  18.     push @{$data{$t[1]}}, [@t];
  19. }
  20. close $in;

  21. open my $include , '>', 'include.txt'
  22.     or die "Can't create 'include.txt' for writing. $!\n";
  23. open my $non_include , '>', 'non_include.txt'
  24.     or die "Can't create 'non_include.txt' for writing. $!\n";
  25. open my $overlap , '>', 'overlap.txt'
  26.     or die "Can't create 'overlap.txt' for writing. $!\n";


  27. while (my ($chr, $v) = each %ref) {
  28.     my @ref_data = sort {$a->[2] <=> $b->[2]} @$v;
  29.     next unless exists $data{$chr};
  30.     my @inc_data = sort {$a->[2] <=> $b->[2]} @{$data{$chr}};
  31.     for (@ref_data) {
  32.         my @rd = @$_;
  33.         last unless @inc_data;
  34.         while (1) {
  35.             last unless @inc_data;
  36.             my @id = @{+shift @inc_data};
  37.             if ($id[3] < $rd[2]) {
  38.                 print {$non_include} join("\t", @id), "\n";
  39.                 next;
  40.             }
  41.             if ($id[2] > $rd[3]) {
  42.                 unshift @inc_data, [@id];
  43.                 last;
  44.             }
  45.             if ($id[2] >= $rd[2] && $id[3] <= $rd[3]) {
  46.                 print {$include} join("\t", @id), "\n";
  47.             }
  48.             else {
  49.                 print {$overlap} join("\t", @id), "\n";
  50.             }
  51.         }
  52.     }
  53.     for (@inc_data) {
  54.         print {$non_include} join("\t", @$_), "\n";
  55.     }
  56.     delete $data{$chr};
  57. }

  58. while (my ($chr, $v) = each %data) {
  59.     my @inc_data = @$v;
  60.     for (@inc_data) {
  61.         print {$non_include} join("\t", @$_), "\n";
  62.     }
  63. }

  64. close $include;
  65. close $non_include;
  66. close $overlap;
复制代码

论坛徽章:
0
14 [报告]
发表于 2013-03-28 09:28 |只看该作者
回复 8# dahe_1984


    为毛我跑的时候貌似一秒钟就完了,数据不大啊。

论坛徽章:
0
15 [报告]
发表于 2013-03-28 09:33 |只看该作者
回复 4# picbhan
这个程序好像无论ref还是lnc中重复的chr没有比对啊。那不能忽略,其起始和终止位置不一样,还是得单独比对。输出的文件中,可能三个文件中有相同的name,但是其区间不一样。


   

论坛徽章:
0
16 [报告]
发表于 2013-03-28 09:40 |只看该作者
回复 15# yanglc2013


    我不明白你说的什么意思。我是按照你在帖子开头说的意思来写代码的,即只在inc和ref之间比较。所以你如果觉得不是这个意思,麻烦说清楚你到底要什么结果。从生物的角度说就行,你这每个区间是个基因?

论坛徽章:
0
17 [报告]
发表于 2013-03-28 09:42 |只看该作者
回复 15# yanglc2013


    你说的name是指第一列吗?同一个文件里面相同染色体上的区间也要比较?

论坛徽章:
0
18 [报告]
发表于 2013-03-28 10:14 |只看该作者
如果让我迅速的解决这个问题,鉴于数据的工整性,我会将数据倒入数据库,利用数据库的查询功能,会非常迅速的得到想要的结果。
如果非要用Perl 来解决这个问题,我看了一下数据, ref文件有4万多条记录, lnc文件有3万多条记录,一次读进内存然后比较的话,对机器的要求还是比较高的。
我的处理方法是
1. 先按照第二列对文件进行分组处理。
   读取ref 文件,按照第二列进行分组,生成一些小文件,放在ref目录下。
   分组后的文件如下:
   对lnc文件进行类似处理
   

2.然后对分组后的文件一对一进行对比分析。

这样处理起来,应该对机器的压力会小很多。由于我上午抽不出时间来完成所有代码,仅列出方法供大家参考

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
19 [报告]
发表于 2013-03-28 11:18 |只看该作者
本帖最后由 rubyish 于 2013-03-31 12:50 编辑

是否:


  1. Delete
  2. 有错误
复制代码

论坛徽章:
0
20 [报告]
发表于 2013-03-28 11:39 |只看该作者
回复 18# climby
这个方法我也试过,但是比较麻烦,因为我后面还有很多这样的数据。如果每个都得细分,那很耗时间的。


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP