基于一列和条件对数组元素进行分组



我有一个四列多行的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

Cluster1DQ566549 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

Cluster2DQ723982 100806991 100807020 1 DQ709023 100806990 100807020 3 DQ712307 100806987 100807014 0

单线态DQ709654 100806987 100807012 571051 DQ707370 100235936 100235962 1481849

这似乎产生了预期的输出。我不确定我是否正确理解了规范,所以可能会有错误和边缘情况。

工作原理:它记住当前输出的section类型($section, SingletCluster)。它累加@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();

相关内容

  • 没有找到相关文章

最新更新