我想生成一个随机数列表,然后将它们与一个文件中的范围列表进行比较。如果一个数字位于其中一个范围内,我希望从另一个文件中的字符串中提取一个子字符串,并将它们全部打印出来。我希望在输出文件中恰好有749个随机子字符串。我组合了不同的代码,它输出了正确的数据,但不是正确的子字符串数量。我相信我应用的749的计数发生在最终的if规则之前,以检查它是否在范围内。我显然可以使用更大的计数,然后手动选择前749个,但是范围分析似乎是按数字对它们进行排序,所以我不会真正随机抽取样本。
编辑:我试图改变代码,以适应随机数字从文件1的每一行的范围,但我得到了一个巨大的输出(152000)行相同的子字符串,代码在底部。
如果有帮助,我将一些示例文件数据放在下面:
File1:
517 1878 forward
2156 3289 forward
3670 3915 forward
3912 5024 forward
5037 6968 forward
7005 9674 forwardFile2:
>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";
}
}
}我真的在努力解决这个问题,所以任何帮助都将不胜感激!
发布于 2014-11-13 17:26:41
您的第一行提到您想要生成随机数。您始终可以在要求的范围内生成随机数,而不是无限制地生成数并丢弃范围外的数。
使用rand()函数可以指定上限和下限。
如下所示:
#!/usr/bin/perl
use strict;
use warnings;
my $range = 100;
my $random_number = int(rand($range));
print $random_number . "\n";请参阅rand()函数手册here
https://stackoverflow.com/questions/26890415
复制相似问题