24小时热门版块排行榜    

查看: 1932  |  回复: 26

essen11

铜虫 (初入文坛)

引用回帖:
18楼: Originally posted by jackie1179 at 2012-05-11 11:28:51:
还有一个可能就是你用查找替换可能是不区分大小写的,如果你不需要区分大小写的话,那么可以再修改下

是需要区分大小写的。不用再修改了,我用查找替换找小写的共有14774处,但是我在程序返回的序列中搜索只有10261,看了一下程序返回的序列,这里面的差异有一部分肯定是因为返回序列不完整引起的,但还有一部分是不是因为程序没找到漏掉了。因此我在想,可以怎样修改一下这个程序可以将不含有短序列的序列找出来,这样,两者的和应该是我的序列总数。但我试着改了一下,只返回3000多条序列,肯定是我没处理好。不知道你是否可以帮着改一下程序,返回不含有gggggcg的序列。谢谢!
21楼2012-05-15 21:43:30
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

jackie1179

木虫 (正式写手)

引用回帖:
21楼: Originally posted by essen11 at 2012-05-15 21:43:30:
是需要区分大小写的。不用再修改了,我用查找替换找小写的共有14774处,但是我在程序返回的序列中搜索只有10261,看了一下程序返回的序列,这里面的差异有一部分肯定是因为返回序列不完整引起的,但还有一部分是 ...

这个程序它是先将分布在多行的每条序列合并为一条完整的序列后再进行正则匹配的,所以一般不会出现匹配不到的情况,下面程序中将不含短序列的序列放到文件out2.txt中,其余不变
#!/usr/bin/perl
use strict;
use warnings;

my @name;
my @seqs;
if($ARGV[0] eq '-h' || $ARGV[0] eq '--help') {
  print "Usage: perl ./$0  input_file  substring\n";
  exit(0);
}
if(@ARGV < 2) {
  print "Arguments not enough!\n";
  exit(0);
}
my $cnt=0;
my $subseq=$ARGV[1];
open IN,"<$ARGV[0]";
open OUTFILE, ">outfile.txt";
open OUTFILE2,">out2.txt";
while({
  if (/^>/) {
    ++$cnt;
    $name[$cnt]=$_;   
   
  }

  if(/^[ATCGatcg]/) {
    chomp;
    $seqs[$cnt] .= $_;
  }

}
close IN;
my $i;
my $length;
my $hits=0;
foreach (1..$cnt) {
  if($seqs[$_]=~/$subseq/) {
    ++$hits;
    print OUTFILE "$name[$_]";
    $length=length $seqs[$_];
    for($i=1;$i<=$length;$i++) {
      printf OUTFILE "%s",substr($seqs[$_],$i-1,1);
      if($i%50 == 0) {
        print OUTFILE "\n";
      }
            
    }
    print OUTFILE "\n";
  } else {
    print OUTFILE2 "$name[$_]";
    $length=length $seqs[$_];
    for($i=1;$i<=$length;$i++) {
      printf OUTFILE2 "%s",substr($seqs[$_],$i-1,1);
      if($i%50 == 0) {
        print OUTFILE2 "\n";
      }
    }
    print OUTFILE2 "\n";
  }
}
print "A total of $hits sequences matched.\n";


close OUTFILE;
close OUTFILE2;
22楼2012-05-16 09:14:03
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

essen11

铜虫 (初入文坛)

引用回帖:
22楼: Originally posted by jackie1179 at 2012-05-16 09:14:03:
这个程序它是先将分布在多行的每条序列合并为一条完整的序列后再进行正则匹配的,所以一般不会出现匹配不到的情况,下面程序中将不含短序列的序列放到文件out2.txt中,其余不变
#!/usr/bin/perl
use strict;
...

if(/^[ATCGatcg]/) {这句话是干什么用的,我怎么改为我要查找的序列之后输出结果就不对了。这里不是起到判别序列里是否有我需要的序列的作用吗?
23楼2012-05-16 18:44:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

jackie1179

木虫 (正式写手)

引用回帖:
23楼: Originally posted by essen11 at 2012-05-16 18:44:01:
if(/^/) {这句话是干什么用的,我怎么改为我要查找的序列之后输出结果就不对了。这里不是起到判别序列里是否有我需要的序列的作用吗?

前一个if(/^>/)表示匹配序列名,后一个if(/^[ATCGatcg]/) 表示匹配序列,只要是序列肯定是以ATCGatcg中的一者开头的
24楼2012-05-18 09:40:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

jackie1179

木虫 (正式写手)

判别序列里是否有我需要的序列是这一句代码:if($seqs[$_]=~/$subseq/) {
25楼2012-05-18 09:41:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

essen11

铜虫 (初入文坛)

引用回帖:
25楼: Originally posted by jackie1179 at 2012-05-18 09:41:51:
判别序列里是否有我需要的序列是这一句代码:if($seqs=~/$subseq/) {

嗯,多谢。好几天没来了,不好意思。这样一来就没什么问题了。
26楼2012-05-23 19:58:16
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

rongren

木虫 (小有名气)

【答案】应助回帖

#!/usr/bin/perl  -w
open IN,"<1.txt";
open OUT1,">out1.txt";
while (<IN> {
        chomp;
        my @abc=split;
        if ($abc[1]=~/ccccAg/) {
                print OUT1 "$_\n";   
        }       
        }
close IN;
close OUT1;
27楼2014-07-21 21:48:20
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 essen11 的主题更新
信息提示
请填处理意见