我有一个如下所述的数组,有四列。每列分别代表起始,终止位置,DNA链和基因。我想将每行分类为多个组,如下所述。
标准:当一行的结束位置与下一行的开始位置之间的差异小于55时,它将被分组在一个列表中。
410 1750 + dnaA
1939 3075 + dnaB
3206 3421 + daaR
3437 4549 + becG
4567 4812 + yaaB
4860 6783 + vyrY
15915 17381 + guaB
19062 19946 + UsaD
19968 20558 + byaE
output format:
List 1:
410 1750 + dnaA
List 2:
1939 3075 + dnaN
List 3:
3206 3421 + yaaA
3437 4549 + recF
4567 4812 + yaaB
4860 6783 + gyrB
List 4:
15915 17381 + guaB
List 5:
19062 19946 + yaaD
19968 20558 + yaaE
答案 0 :(得分:-3)
您可以使用以下内容作为开始。
我假设,数据部分由单个空格分割,如示例中所示,并且数据位于名为" data.txt"的文件中。
结果是一个包含要组合在一起的元素的数组数组。
#!/usr/bin/perl
#
use strict;
use warnings;
use Data::Dumper;
open(my $fd, "<", "data.txt")
|| die("could not open file: $!");
my @sets;
my %last;
my $set_index = 0;
while (<$fd>) {
my %current;
($current{start}, $current{end}, undef, $current{sequence}) = split(" ", $_);
if(exists($last{end}) &&
$current{start} - $last{end} >= 55) {
push(@sets, []);
$set_index++;
}
push(@{$sets[$set_index]}, \%current);
%last = %current;
}
print Dumper(@sets);
除了知道数组和散列之外,您还需要了解如何使用引用使用perl构建复杂的数据结构。这在http://perldoc.perl.org/perlref.html中有解释,http://perldoc.perl.org/perlreftut.html中有深入介绍。
这绝对不是达到你想要的最简洁的方式,但我希望,这是可以理解的。
尽管如此,如果你不想了解正在发生的事情,你将不会对此感到高兴,因为你需要对自己进行更改。