我很新的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