У меня есть файл с разделителями в виде вкладок с повторяющимися значениями в первом столбце. Единичные, но повторяющиеся значения в первом столбце соответствуют нескольким значениям во втором столбце. Это выглядит примерно так:Анализ файла на основе идентификатора столбца: perl
AAAAAAAAAA1 m081216|101|123
AAAAAAAAAA1 m081216|100|1987
AAAAAAAAAA1 m081216|927|463729
BBBBBBBBBB2 m081216|254|260489
BBBBBBBBBB2 m081216|475|1234
BBBBBBBBBB2 m081216|987|240
CCCCCCCCCC3 m081216|433|1000
CCCCCCCCCC3 m081216|902|366
CCCCCCCCCC3 m081216|724|193
Для каждого типа последовательности в первом столбце, я пытаюсь напечатать в файл только с последовательностями, которые соответствуют ей. Имя файла должно включать повторяющуюся последовательность в первом столбце и количество последовательностей, которые соответствуют ему во втором столбце. В приведенном выше примере я бы поэтому имел 3 файла по 3 последовательностей. Первый файл будет называться что-то вроде «AAAAAAAAAA1.3.txt» и выглядеть следующим образом при открытии:
m081216|101|123
m081216|100|1987
m081216|927|463729
Я видел другие подобные вопросы, но они ответили, используя хэш. Я не думаю, что не могу использовать хеш, потому что мне нужно поддерживать количество связей между столбцами. Может быть, есть способ использовать хэш хешей? Я не уверен. Вот мой код.
use warnings;
use strict;
use List::MoreUtils 'true';
open(IN, "<", "/path/to/in_file") or die $!;
my @array;
my $queryID;
while(<IN>){
chomp;
my $OutputLine = $_;
processOutputLine($OutputLine);
}
sub processOutputLine {
my ($OutputLine) = @_;
my @Columns = split("\t", $OutputLine);
my ($queryID, $target) = @Columns;
push(@array, $target, "\n") unless grep{$queryID eq $_} @array;
my $delineator = "\n";
my $count = true { /$delineator/g } @array;
open(OUT, ">", "/path/to/out_$..$queryID.$count.txt") or die $!;
foreach(@array){
print OUT @array;
}
}
Вы, вероятно, также необходимо удалить файл записи из цикла, или вы будете писать над ним с каждой строкой данных. –