我很新的Perl和有,我想通過Perl來完成一項任務:查找多個文件的公共密鑰和不同的值存儲到一個數組,並計算不同
我有很多的文件看起來像這樣的:(空間deliminated,每個人都有行6列,數千;所有文件以* .hgt結束)
example.hgt
ID NAMES Test1 Test2 Percentage Height
1 abc10A B 0.21 165
1 abc40A B 0.99 162
1 abc30C B 0.107 165
1 abc20A E 0.31 167
1 abc50A B 0.7 165
....
每個名字在每個.hgt文件是唯一的。我想找到所有.hgt文件中常見的NAMES,並提取所有百分比,並找出最高和最低數字之間的最大差異。
例如,如果我有5個.hgt文件,並且它們都包含NAMES = abc300123,並且相應的百分比是:0.107,0.1,0.4,0.9,0.8,那麼abc300123的最大差異應該是0.9 - 0.1 = 0.8
然後我想輸出NAMES和與從我的所有文件計算出來的NAMES相關的最大差異。輸出的順序按最大差異排序。每行前面有一個整數(0,1,2,3,...)。一個例子是這樣的:
輸出
0. abc50.1
1. abc90.3
2. abc10.7
3. abc30.8
4. abc11.9
....
我試圖通過每個文件中讀取並存儲在密鑰=名稱和值=百分比成陣列。我想對Percentage數組進行排序,並將最大值和最小值存儲到新數組中,並進行負數計算。有些時候我陷入了困境,無法把事情放在一起。
這裏是我寫到目前爲止:
open(PIPEFROM, "ls *.hgt |") or die "no \.hgt files founded\!\n"; ## find the files that are ended with hgt
$i=0;
@filenames = "";
while($temp = <PIPEFROM>){
$temp =~ m/\.hgt/;
print out "$temp";
$pre = $`; #gives file name without the dot and the hgt extension
$filenames[$i] = $pre;
$i++;
}
%hash =();
$j=0;
## read in files ended with .hgt
for ($i = 0; $i<=$filenames; $i++) {
$temp = $filenames[$i];
open(PIPETO, "cat $temp.hgt |") or die "no \.hgt files founded\!\n";
<PIPETO>;
while ($temp2 = <PIPETO>){
chomp $temp2;
$temp2 = ~ s/^\s+//;
@lst = split(/\s+/, $temp2);
$NAMES = $lst[1];
$Percentage = $lst[4];
$hash{$NAMES} .= $Percentage . " ";
}
}
### manipulate the values
foreach $key (sort keys %hash){
@values = split(/\s+/, $hash{$key});
if ($#values == $#filenames){
print "$j" . "\." . " " . "$key" . "\n";
$j++;
### got stuck
}
}
我想包括到這個問題,但我不知道在哪裏把它:
my ($smallest, $largest) = (sort {$a <=> $b} @array)[0,-1];
這是如此令人沮喪的。任何形式的幫助將不勝感激!
你說每個文件中有成千上萬的獨特行,但可能的差異只能是樣本中十個值中的一個(0.0 - 0.9)。如果是這樣的話,你可能會有數百行的差異。對我來說沒有意義。 :-) – 2013-03-26 02:30:21
每一行是由「名稱」和可能存在的差異可以是0和1之間的任何東西,如0.1,0.25,區分0.981等,依賴於最大和最小值在第5列中這使得對每個更小線百分比差異。百分比差異首先排序,NAMES排序下一個。 – user1687130 2013-03-26 03:08:27
您的示例顯示輸出按最小百分比排序,即按升序排序。如果這不是您想要的,則在sort命令中將$ a和$ b更改爲$ b和$ a。 – 2013-03-26 18:11:18