在分析随机位置后,从基因组中获取随机子串

时间:2014-11-12 15:22:09

标签: regex perl split

我想生成一个随机数列表,然后将它们与一个文件的范围列表进行比较。如果数字位于其中一个范围内,我想从另一个文件中的字符串中提取子字符串,然后将它们全部打印出来。我想在输出文件中最终得到749个随机子串。我已经组合了各种代码,它输出的是正确的数据,但不是正确的子串数。我相信我已应用749的计数发生在最终if规则之前,以检查它是否在范围内。我显然可以使用更大的计数然后手动选择第一个749,但是范围分析似乎在数字上对它们进行排序,因此我不会采用真正随机的样本。

编辑:我试图更改代码以将随机数容纳到文件1中每行的范围内,但是我获得了相同子字符串的大量输出(152000)行,代码位于底部。

如果有帮助我在下面放了一些示例文件数据:

File1中:

517 1878 forward
2156 3289 forward
3670 3915 forward
3912 5024 forward
5037 6968 forward
7005 9674 forward

文件2:

>gi|385195117|emb|HE681097.1| Staphylococcus aureus subsp. aureus HO 5096 0412 complete genome
CGATTAAAGATAGAAATACACGATGCGAGCAATCAAATTTCATAACATCACCATGAGTTTGGTCCGAAGCATGAGTGTTTACAATGTTTGAATACCTTATACAGTTCTTATACATACCGATTAAAGATAGAAATACACGATGCGAGCAATCAAATTTCATAACATCACCATGAGTTTGGTCCGAAGCATGAGTGTTTACAATGTTTGAATACCTTATACAGTTCTTATACATACCGATTAAAGATAGAAATACACGATGCGAGCAATCAAATTTCATAACATCACCATGAGTTTGGTCCGAAGCATGAGTGTTTACAATGTTTGAATACCTTATACAGTTCTTATACATAC

代码:

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;
use autodie;

chdir '/Users/edwardtickle/Documents';

open my $fh, '<', 'CC22rangesCDS.txt';

my @file1;
while (<$fh>) {
push @file1, [ split ];
}

my $size       = 21;
my $count      = 749;
my $min_length = ( $count - 1 ) * ( 2 * $size - 1 ) + $size;

open my $out, '>', 'randomnumberoutput.txt';

open $fh, '<', 'EMRSA-15.fasta';

while (my $line = <$fh>) {
next unless $line =~ /^([ATCG]+)/;

my $genome = $1;

if ( $min_length > length $genome ) {
    warn "Line $., Genome too small:  Must be $min_length, not ", length($genome), "\n";
    next;
}

my @pos = ( 0 .. length($genome) - 1 - ( $size - 1 ) );

for ( 1 .. $count ) {
    my $index = int rand @pos;
    my $pos   = $pos[$index];

    my $min = $index - ( $size - 1 );
    $min = 0 if $min < 0;
    splice @pos, $min, $size + $index - $min;

    for my $file1 (@file1) {

    my $substring = substr ($genome, $pos, $size);

    if ( $pos >= $file1->[0] and $pos <= $file1->[1] ) {

    print $out "$substring\n";
            }
        }
    }
   }

取消工作代码:

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;
use autodie;

chdir '/Users/edwardtickle/Documents';

open my $fh, '<', 'CC22rangesCDS.txt';

my @file1;
while (<$fh>) {
push @file1, [ split ];
}

my $size       = 21;
my $count      = 749;

open my $out, '>', 'randomtestingoutput.txt';

open $fh, '<', 'EMRSA-15.fasta';

while (my $line = <$fh>) {
next unless $line =~ /^([ATCG]+)/;

my $genome = $1;

for my $file1 (@file1) {

my $range = ($file1->[1] - $file1->[0]);
my $minimum = $file1->[0];

my $position = int(rand($range)) + $minimum;

for ( 1 .. $count ) {

    my $substring = substr ($genome, $position, $size);

    print $out "$substring\n";
            }
        }
    }

我真的很挣扎,所以任何帮助都会受到赞赏!

1 个答案:

答案 0 :(得分:0)

您的第一行提到您想要生成随机数。您始终可以在所需范围内生成随机数,而不是无限制地生成数字,并丢弃超出范围的数字。

rand()函数允许您指定上限和下限。

这样的事情:

  #!/usr/bin/perl
  use strict;
  use warnings;

  my $range = 100;

  my $random_number = int(rand($range));

  print $random_number . "\n";

参考rand()函数手册here