我有一個製表符分隔的文件,在第一列中有重複的值。第一列中的單個但重複的值對應於第二列中的多個值。它看起來是這樣的:根據列ID解析文件: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;
}
}
你可能也想從循環中刪除文件的寫入,否則你會用每一行數據寫下來。 –