我有一个四列多行的AoA结构。下面是一个数据(输入)的例子。
DQ556929 103480190 103480214 154943
DQ540839 103325247 103325275 2484
DQ566549 103322763 103322792 99
DQ699634 103322664 103322694 0
DQ544472 103322664 103322692 373
DQ709105 103322291 103322318 46
DQ705937 103322245 103322273 486
DQ699398 103321759 103321788 1211
DQ710151 103320548 103320577 692251
DQ548430 102628297 102628326 1
DQ558403 102628296 102628321 855795
DQ692476 101772501 101772529 481463
DQ544274 101291038 101291068 484047
DQ723982 100806991 100807020 1
DQ709023 100806990 100807020 3
DQ712307 100806987 100807014 0
DQ709654 100806987 100807012 571051
DQ707370 100235936 100235962 1481849
我想将所有行元素(按顺序)分组并写入一个文件。条件是,如果列四值小于1000,并且最小两个值相邻,则将它们分组,否则,如果值小于1000并且位于大于1000的值之间,则将它们视为单个并单独追加到同一个文件中,并且大于1000的值也作为块写入,但不影响第二列和第三列的顺序。
这个文件是我以前的程序的输出,现在我已经尝试实现我的手,但得到一些奇怪的结果。这是我的代码块,但非功能。伙计们,如果我在这里很好地执行我的逻辑,我需要的只是帮助,作为一个初学者,我愿意接受任何评论。还可以在任何地方纠正我。
my @dataf= sort{ $a->[1]<=> $b->[1]} @data;
@dataf=reverse @dataf;
for(my $i>=0;$i<=$#Start;$i++)
{
print "$sortStart[$i]n";
my $diff = $sortStart[$i] - $sortStart[$i+1];
$dataf[$i][3]= $diff;
# $IDdiff{$ID[$i]}=$diff;
}
#print Dumper(@dataf);
open (CLUST, ">> ./clustTest.txt" );
for (my $k=0;$k<=$#Start;$k++)
{
for (my $l=0;$l<=3;$l++)
{
# my $tempdataf = shift $dataf[$k][$l];
# print $tempdataf;
if ($dataf[$k][3]<=1000)
{
$flag = 1;
do
{
print CLUST"----- Cluster $clustNo -----n";
print CLUST"$dataf[$k][$l]t";
if ($dataf[$k][3]<=1000)
{
$flag1 = 1;
}else {$flag1=0;}
$clustNo++;
}until($flag1==0 && $data[$k][3] > 1000);
if($flag1==0 && $data[$k][3] > 1000)
{
print CLUST"Singlet n";
print CLUST"$dataf[$k][$l]t";
next;
}
#print CLUST"$dataf[$k][$l]t"; #@IDdiff
}
print CLUST"n";
}
}
期望文件输出:
单线态
DQ556929 103480190 103480214 154943 DQ540839 103325247 103325275 2484
Cluster1
DQ566549 103322763 103322792 99 DQ699634 103322664 103322694 0 DQ544472 103322664 103322692 373 DQ709105 103322291 103322318 46 DQ705937 103322245 103322273 486
单线态
DQ699398 103321759 103321788 1211 DQ710151 103320548 103320577 692251 DQ548430 102628297 102628326 1 DQ558403 102628296 102628321 855795 DQ692476 101772501 101772529 481463 DQ544274 101291038 101291068 484047
Cluster2
DQ723982 100806991 100807020 1 DQ709023 100806990 100807020 3 DQ712307 100806987 100807014 0
单线态
DQ709654 100806987 100807012 571051 DQ707370 100235936 100235962 1481849
这似乎产生了预期的输出。我不确定我是否正确理解了规范,所以可能会有错误和边缘情况。
工作原理:它记住当前输出的section类型($section, Singlet
或Cluster
)。它累加@cluster数组中的行,如果它们属于一起,当不兼容的行到达时,打印集群并启动新的集群。如果要打印的集群只有一个成员,则将其视为单态。
#!/usr/bin/perl
use warnings;
use strict;
my $section = q();
my @cluster;
my $cluster_count = 1;
sub output {
if (@cluster > 1) {
print "Cluster$cluster_countn";
$cluster_count++;
} elsif (1 == @cluster) {
print $section = 'Singlet', "sn" unless 'Singlet' eq $section;
}
print for @cluster;
@cluster = ();
}
my $last = 'INF';
while (<>) {
my ($id, $from, $to, $value) = split;
if ($value > 1000 || 1000 < abs($last - $from)) {
output();
} else {
$section = 'Cluster';
}
push @cluster, $_;
$last = $to;
}
output();