2015-09-04 51 views
-1
#! /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"$tempS\t$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$diff\n"; 
} 

排序其他两个阵列我有相同的长度的三个阵列,ID用的ID(字符串),StartEnd与整数值(从文件读取)。ID跟踪,同时交换和在Perl

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

三个阵列,IDStartEnd,都在我的考虑之下。

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

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,开始,结束分别。如果开始>结束,我只在这两个数组之间交换它们。但交换后,降序可能会改变,但我希望它们的降序也是它们对应的否定ID,如上所述。

+2

请添加您的代码。 – serenesat

+0

请忽略我的代码中的哈希创建。 – Kanhu

+0

添加输入数据和预期输出会更有帮助。 – serenesat

回答

3

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

#!/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的顺序都是相同的。

+0

谢谢你,我提供的数据集是按照开始和结束的降序排列的,在这里你会发现一些开始大于结束,反之亦然。所以我只希望开始时比对应的最终值小,所以如果在开始>结束时换掉这两个值,我的下一个数据处理步骤就完成了。就像这之后,我想要否定从之前的开始点开始的下一个数据,但是如果没有对它们进行排序,那么在某些点上只会得到负值。全过程也是如此。 – Kanhu

+0

@Kanhu:您是否注意到我的代码在需要时会交换开始和结束? – choroba

+0

是的,我注意到这里。但我不太清楚哈希中的排序过程。好像它会照顾我进一步加工的目的!我正在尝试这个,会在这里更新。非常感谢你。 :-) – Kanhu