Я хочу сгенерировать список случайных чисел, прежде чем сравнивать их со списком диапазонов из одного файла. Если число лежит в одном из диапазонов, я хочу извлечь подстроку из строки в другом файле и распечатать все. Я хочу получить точно 749 случайных подстрок в выходном файле. Я объединил различные фрагменты кода, и он выводит правильные данные, но не правильное количество подстрок. Я считаю, что число, к которому я применил 749, встречается до окончательного правила, чтобы проверить, находится ли он в диапазонах. Я мог бы, очевидно, использовать более крупный счет, а затем вручную выбрать первый 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";
}
}
}
Я действительно борюсь с этим, поэтому любая помощь будет оценена!
Я попытался с помощью руководство, чтобы установить диапазоны в зависимости от множества диапазонов из file1 и я поставил код в мой первоначальный пост, он по-прежнему не работает должным образом. Приветствую вас за помощь. –