免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2042 | 回复: 7
打印 上一主题 下一主题

新手,大家帮我看一下吧(已解决,谢各位高手各种指点) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-07 21:12 |只看该作者 |倒序浏览
本帖最后由 shilin320 于 2010-08-10 08:49 编辑

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之间。
补充:找出这些(对儿)。

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

论坛徽章:
0
2 [报告]
发表于 2010-08-07 21:17 |只看该作者
  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;
复制代码
这是雏形,请帮新手看看,谢谢~~

论坛徽章:
0
3 [报告]
发表于 2010-08-07 22:49 |只看该作者
  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
复制代码
(你提供的数据,没有一组是符合的,我改了一下数据)

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

论坛徽章:
0
4 [报告]
发表于 2010-08-08 08:56 |只看该作者
是的。我的数据量不小。谢谢iamlimeng。

论坛徽章:
0
5 [报告]
发表于 2010-08-08 14:09 |只看该作者
  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.                 open IN1,"$ARGV[1]";
  11.                 while(<IN1>)                                      
  12.                 {
  13.                         chomp;
  14.                         if(/((\S+)_reverse)\s+(\S+)\s+(\S+)/)
  15.                         {
  16.                                 #print"$1\t$2\t$3\t$4\n";
  17.                                 $gi=$2;
  18.                                 $id1=$1;
  19.                                 $pos1=$3;
  20.                                 $site1=$4;
  21.                                 if($gi eq $id)
  22.                                 {
  23.                                         $val=$pos1-$pos;
  24.                                         if(abs $val <= 128 && abs $val >= 45)
  25.                                         {
  26.                                                 print"$id\t$id1\t$pos\t$pos1\t$val\n";     
  27.                                         }
  28.                                 }
  29.                         }
  30.                 }close IN1;
  31.         }
  32. }
  33. close IN;
复制代码
师兄写的,果然”条条大路通罗马“

论坛徽章:
0
6 [报告]
发表于 2010-08-08 15:59 |只看该作者
  1. use strict;
  2. use warnings;

  3. my %hash;
  4. open ( DATA,"$ARGV[0]") or die "$! \n";
  5. while ( <DATA> ) {
  6.         my @temp = split /\s+/,$_;
  7.         if ( $temp[0] =~ /(.*)_reverse/ ) {
  8.                 $hash{$temp[0]} .= "$temp[1] ";
  9.         }
  10.         else {
  11.                 $hash{$temp[0]} .= "$temp[1] ";
  12.         }
  13. }
  14. close DATA;
  15. foreach ( keys %hash ) {
  16.         my @temp = split /\s+/,$hash{$_};
  17.         $hash{$_} = \@temp;
  18. }
  19. foreach ( keys %hash ) {
  20.         my @resualt = ();
  21.         if ( ! /(.*)_reverse/ ) {
  22.                 my $name1 = my $name2 = $_;
  23.                 $name2 .= "_reverse";
  24.                 foreach ( @{$hash{$name1}} ) {
  25.                         my $vau = $_;
  26.                         foreach ( @{$hash{$name2}} ) {
  27.                                 my $resu = $_;
  28.                                 $resu = abs ( $resu - $vau );
  29.                                 push @resualt, $resu if ( $resu >= 45 && $resu <= 128 );
  30.                         }
  31.                 }
  32.                 print "$name1 <<>> $name2 => @resualt \n";
  33.         }
  34. }
复制代码

论坛徽章:
0
7 [报告]
发表于 2010-08-08 18:57 |只看该作者
本帖最后由 paktc 于 2010-08-08 19:05 编辑

根据分布情况做的,空行无碍

  1. open READ,"<text.txt" or die "$!";
  2. @lines=<READ>;
  3. close READ;
  4. $i=0;  $flag=0;  $hapeen=0;
  5. foreach (@lines) {
  6. $i+=1;
  7. if (! /^\s*$/) {
  8.    if (/_reverse/i) {
  9.         $flag=0;
  10.         @cut=split(" ",$_);
  11.         @cuta=split(" ",$lines[$i-$record-1]);
  12.         $delta=abs($cut[1]-$cuta[1]);
  13.         print "\n[$cut[0]]\tVS \n[$cuta[0]]\n";
  14.         print "$cut[1] $cuta[1], delta = $delta\n";
  15.         print "\t\t\t45<delta<128\n" if (45<=$delta && $delta<=128);
  16.    } else {
  17.         $flag+=1;
  18.         $record=$flag;
  19.    }
  20. }
  21. }
  22. <STDIN>;
复制代码

论坛徽章:
0
8 [报告]
发表于 2010-08-08 20:37 |只看该作者
我作为新手,能在实践中锻炼,受益匪浅。
更多的是得益于大家的帮助和分享。
再次谢过各位高手~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP