0

このような形式のデータがたくさんあります

Amistad Academy District Amistad Academy    596 812 73.4
Andover School District  Andover            39  334 11.7
Ansonia School District  Ansonia High School    427 732 58.3
Ansonia School District  Ansonia Middle School  219 458 47.8
Ansonia School District  Mead School            431 642 67.1
Ansonia School District  Prendergast School 504 787 64

私がする必要があるのは、一連の学区を grep し、最後の列を取り、一致するすべての学区 (たとえば、アンソニアのすべて) を合計し、その数を最後から 2 番目の列の合計で割ることです。学区を別々のファイルに入れるのに問題はありません。それはただのgrepでした。しかし、今は行き詰まっており、Excelで行う方が簡単かもしれないと考えています. 私はperlのようなソリューションで遊んでいます

  1 #!/opt/local/bin/perl
  2 use strict;
  3 use warnings;
  4 use ARGV::readonly;
  5 
  6 my @data;
  7 my @headers - split ',', <>;
  8 
  9 while (<>) {
 10   my @row = split;
 11   $data[$_] += $row[$_] for (0 .. $#row);
 12 }
 13 
 14 $" = "\t";
 15 print "@headers", "\n";
 16 print "@data";

しかし、合計と除算を行うための構文を理解できません。

ありがとう。

4

2 に答える 2

1

すべての列を合計しています。あなたはそれらのうちの2つを合計したいだけです。そうでなければ、あなたは実際にそこにいます。

my $sum_last = 0;  # Use better name.
my $sum_penu = 0;  # Use better name.
while (<>) {
   chomp;
   my @row = split /\t/;
   next if $row[0] ne 'Ansonia School District';
   $sum_last += $row[-1];
   $sum_penu += $row[-2];
}

say $sum_last / $sum_penu;
于 2012-05-22T17:19:13.897 に答える
0

以下のプログラムは、ファイルから値を選択し、各学区の現在の合計をハッシュで保持します。ハッシュの内容は、すべてのデータが読み取られたときに出力されます。フィルタリングされていないファイルから機能します。別のソースにgrepする必要はありません。

データがタブで区切られているように見えますsplit /\t/。スペース文字を含むフィールドも分割されないように使用することが重要です。

データの意味がわからないので、コードを読みやすくすることはできません。

ご不明な点がございましたら、もう一度お問い合わせください。

use strict;
use warnings;

open my $fh, '<', 'myfile' or die $!;

scalar <$fh>; # lose header record

my %data;

while (<$fh>) {
  my @fields = split /\t/;
  my $district = shift @fields;
  $data{$district}[0] += $fields[-2];
  $data{$district}[1] += $fields[-1];
}

for my $district (sort keys %data) {
  printf "%s - %f\n", $district, $data{$district}[1] / $data{$district}[0];
}

出力

Andover School District - 0.035030
Ansonia School District - 0.090569
于 2012-05-22T17:54:03.893 に答える