ID跟踪,同时在perl中交换和排序其他两个数组


#! /usr/bin/perl
use strict;
my (@data,$data,@data1,@diff,$diff,$tempS,$tempE, @ID,@Seq,@Start,@End, @data2);
#my $file=<>;
open(FILE, "< ./out.txt");
while (<FILE>){
        chomp $_;
    #next if ($line =~/Measurement count:/ or $line =~/^s+/)  ;
        #push @data, [split ("t", $line)] ;
    my @data = split('t');

            push(@ID, $data[0]);
            push(@Seq, $data[1]);
            push(@Start, $data[2]);
            push(@End, $data[3]);                   
#        push @$data, [split ("t", $line)] ;
}
close(FILE);
my %hash = map { my $key = "$ID[$_]"; $key => [ $Start[$_], $End[$_] ] } (0..$#ID);
for my $key (  %hash ) {
    print "Key: $key contains: ";
    for my $value ($hash{$key} ) {
        print " $hash{$key}[0] ";
    }
    print "n";
}
for (my $j=0; $j <=$#Start ; $j++)
{
    if ($Start[$j] > $End[$j])
    {
        $tempS=$Start[$j];
        $Start[$j]=$End[$j];
        $End[$j]=$tempS;
    }
        print"$tempSt$Start[$j]t$End[$j]n";
}
my @sortStart = sort { $a <=> $b } @Start;
my @sortEnd = sort { $a <=> $b } @End;
#open(OUT,">>./trial.txt");
for(my $i=1521;$i>=0;$i--)
{
    print "hey";
    my $diff = $sortStart[$i] - $sortStart[$i-1];
    print  "$ID[$i]t$diffn";
}

我有三个相同长度的数组,ID具有id(字符串),StartEnd具有整数值(从文件读取)。

我想循环遍历所有这些数组,还想跟踪id。首先,如果开始>结束,我将与End交换Start中的元素,然后我必须对这两个数组进行排序以供进一步应用(因为我为Start中的每个项目否定Start[0]-Start[1])。在排序时,Id值可能会改变,并且由于我的Id对于每个Start和End元素都是唯一的,我如何在排序时跟踪我的Id ?

三个数组,ID, StartEnd,在我的考虑之下。

这是我的一小块输入数据:

DQ704383    191990066   191990037
DQ698580    191911184   191911214
DQ724878    191905507   191905532
DQ715191    191822657   191822686
DQ722467    191653368   191653339
DQ707634    191622552   191622581
DQ715636    191539187   191539157
DQ692360    191388765   191388796
DQ722377    191083572   191083599
DQ697520    189463214   189463185
DQ709562    187245165   187245192
DQ540163    182491372   182491400
DQ720940    180753033   180753060
DQ707760    178340696   178340726
DQ725442    178286164   178286134
DQ711885    178250090   178250119
DQ718075    171329314   171329344
DQ705091    171062479   171062503

上述ID, Start, End。如果Start> End,我只在这两个数组之间交换它们。但是在交换降序后可能会改变,但我希望它们按照降序排列,也希望它们对应的ID可以如上所述进行否定。

不要使用不同的数组,使用散列将相关的信息片段保存在一起。

#!/usr/bin/perl
use warnings;
use strict;
use enum qw( START END );
my %hash;
while (<>) {
    my ($id, $start, $end) = split;
    $hash{$id} = [ $start < $end ? ($start, $end)
                                 : ($end, $start) ];
}
my @by_start = sort { $hash{$a}[START] <=> $hash{$b}[START] } keys %hash;
my @by_end   = sort { $hash{$a}[END]   <=> $hash{$b}[END]   } keys %hash;
use Test::More;
is_deeply(@by_start, @by_end, 'same');
done_testing();

此外,在您提供的数据示例中,无论如何排序,id的顺序都是相同的。

相关内容

最新更新