+ -
当前位置:首页 → 问答吧 → 新手,大家帮我看一下吧

新手,大家帮我看一下吧

时间:2010-08-07

来源:互联网

本帖最后由 shilin320 于 2010-08-07 21:23 编辑

BJ_080907446G_2169_lj.seq.Contig1        132        GCTCAAC
BJ_080907446G_2169_lj.seq.Contig1        1526        ATTTAAC
BJ_080907446G_2169_lj.seq.Contig1_reverse        740        GTTAGGT
BJ_080907446G_2169_lj.seq.Contig1_reverse        927        GTTAAGT
BJ_080407712G_82_lj.seq.Contig1        134        GCTCAAC
BJ_080407712G_82_lj.seq.Contig1        928        GCCTAAC
BJ_080407712G_82_lj.seq.Contig1        1528        ATTTAAC
BJ_080407712G_82_lj.seq.Contig1_reverse        742        GTTAGGT
BJ_080407712G_82_lj.seq.Contig1_reverse        929        GTTAAGT
BJ_080407712G_82_lj.seq.Contig1_reverse        1554        GTTGGAT
数据如上。说明如下:
一行中,空格之前的算是id(如BJ_080907446G_2169_lj.seq.Contig1),之后是长度(如132),最后是端序列(如GCTCAAC)。
我想达到的目的是:id一样的前提下,reverse对应的编号(如740)减去非reverse对应的编号(如132)。
这样就会得到同id的一组数字的差值(如第一个id:740-132,740-1526,927-132,927-1526等等)。
这个差值(绝对值)要在45到128之间。
补充:找出这些(对儿)。

谢谢大家帮我看看,要怎么写。

作者: shilin320   发布时间: 2010-08-07

  1. open IN,"$ARGV[0]";
  2. while(<IN>)
  3. {
  4.         chomp;
  5.         if(/(\S+)\s+(\S+)\s+(\S+)/)
  6.         {
  7.                 $id=$1;
  8.                 $pos=$2;
  9.                 $site=$3;
  10.                 while(<IN>)
  11.                 {
  12.                         chomp;
  13.                         if(/(\S+)\s+(\S+)\s+(\S+)/)
  14.                         {
  15.                                 $id1=$1;
  16.                                 $pos1=$2;
  17.                                 $site1=$3;
  18.                                 if($id1=~/$id\S+/)
  19.                                 {
  20.                                         $val=$pos1-$pos;
  21.                                         print"$val\n";
  22.                                 }
  23.                                 else
  24.                                 {
  25.                                         last;
  26.                                 }
  27.                         }
  28.                 }
  29.         }
  30. }
  31. close IN;
复制代码
这是雏形,请帮新手看看,谢谢~~

作者: shilin320   发布时间: 2010-08-07

  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. my %bio;
  5. while (<DATA>) {
  6.         chomp;
  7.         my ($id,$len,$serial) = split(/\s+/,$_);
  8.         if ($id =~ /(.*)_reverse/i) {
  9.              $bio{$1}{reverse}{$len} = $_;
  10.         }
  11.         else { $bio{$id}{original}{$len} = $_; }
  12. }
  13. foreach my $id (keys %bio) {
  14.         foreach my $len_o (keys %{$bio{$id}{original}}) {
  15.                 foreach my $len_r (keys %{$bio{$id}{reverse}}) {
  16.                         if (abs($len_o-$len_r) >= 45 and abs($len_o-$len_r) <= 128) {
  17.                                 print "$bio{$id}{original}{$len_o}\n$bio{$id}{reverse}{$len_r}\n\n";
  18.                         }
  19.                 }
  20.         }
  21. }

  22. <STDIN>;

  23. __DATA__
  24. BJ_080907446G_2169_lj.seq.Contig1        132        GCTCAAC
  25. BJ_080907446G_2169_lj.seq.Contig1        1526        ATTTAAC
  26. BJ_080907446G_2169_lj.seq.Contig1_reverse        240        GTTAGGT
  27. BJ_080907446G_2169_lj.seq.Contig1_reverse        1427        GTTAAGT
  28. BJ_080407712G_82_lj.seq.Contig1        134        GCTCAAC
  29. BJ_080407712G_82_lj.seq.Contig1        928        GCCTAAC
  30. BJ_080407712G_82_lj.seq.Contig1        1528        ATTTAAC
  31. BJ_080407712G_82_lj.seq.Contig1_reverse        742        GTTAGGT
  32. BJ_080407712G_82_lj.seq.Contig1_reverse        829        GTTAAGT
  33. BJ_080407712G_82_lj.seq.Contig1_reverse        1554        GTTGGAT
复制代码
(你提供的数据,没有一组是符合的,我改了一下数据)

你看这样行不行。不过如果你的数据量很大,就要考虑内存的容量,上述程序会将数据全部读入内存。

作者: iamlimeng   发布时间: 2010-08-07