私はPerlに非常に慣れていないので、perlで達成したいタスクがあります:
次のような多くのファイルがあります: (スペースで区切られ、それぞれに 6 列と数千行があり、すべてのファイルは *.hgt で終わります)
たとえば .hgt
ID NAMES Test1 Test2 Percentage Height
1 abc100123 A B 0.21 165
1 abc400123 A B 0.99 162
1 abc300123 C B 0.107 165
1 abc200123 A E 0.31 167
1 abc500123 A B 0.7 165
....
各 NAMES は、各 .hgt ファイルで一意です。すべての .hgt ファイルで共通の名前を見つけて、すべてのパーセンテージを抽出し、最大数と最小数の最大の違いを見つけたいと考えています。
たとえば、5 つの .hgt ファイルがあり、そのすべてに NAMES = abc300123 が含まれていて、それに応じたパーセンテージが 0.107、0.1、0.4、0.9、0.8 の場合、abc300123 の最大の差は 0.9 - 0.1 = 0.8 になります。
次に、すべてのファイルから計算された名前とその名前に関連付けられた最大の違いを出力したいと思います。出力の順序は、最大の差によってソートされます。各行の前に整数があります (0、1、2、3、...)。例は次のようになります。
出力
0. abc500123 0.1
1. abc900123 0.3
2. abc100123 0.7
3. abc300123 0.8
4. abc110123 0.9
....
各ファイルを読み込もうとし、キー = NAMES と値 = パーセンテージを配列に格納しました。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];
これはとてもイライラします。どんな親切な助けも大歓迎です!