我想生成一个随机数列表,然后将它们与一个文件的范围列表进行比较。如果数字位于其中一个范围内,我想从另一个文件中的字符串中提取子字符串,然后将它们全部打印出来。我想在输出文件中最终得到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";
}
}
}
我真的很挣扎,所以任何帮助都会受到赞赏!
答案 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