【发布时间】:2016-12-19 19:06:41
【问题描述】:
我有一个制表符划定的文件,第一列中有重复的值。第一列中的单个但重复的值对应于第二列中的多个值。它看起来像这样:
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;
}
}
【问题讨论】:
-
您可能还想从循环中删除文件写入,或者您将用每一行数据写入它。
标签: perl parsing hash multiple-columns subroutine