2012-05-22 3 views
0

은 내가 대한 (Ansonia 모든 학군의 무리를 grep을하면된다 다음, 마지막 열을 일치하는 모든 지역을 요약 할 사항이스프레드 시트에서 열을 추가 한 다음 Perl에서 백분율을 어떻게 생성합니까?

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이었습니다. 하지만 지금은 붙어있어 Excel에서 더 쉽게 할 수 있다고 생각합니다. 나는 펄과 같은 솔루션으로 놀았습니다.

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"; 

구문을 이해할 수 없으며 합계와 나눗셈을 수행 할 수 없습니다.

감사합니다.

+0

인가? 숙제를 돕는 데 문제가 없지만 적절하게 답변을 조정할 수 있는지 명시하십시오. – ikegami

+0

숙제가 아닙니다. 제 아내는 교육 재단의 연구원입니다. 나는 어리석게도 간단한 스크립트로 훨씬 더 쉬워 질 것이라고 말했습니다. – edwardiglesias

+1

@edward : 걱정하지 마라. 나는 그것이 그녀 자신의 모든 일이라고 그녀에게 말할 것이다. :) – Borodin

답변

1

모든 열을 합산합니다. 당신은 그 중 두 가지를 합산하기를 원할뿐입니다. 그렇지 않으면 실제로 거기에 있습니다.

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; 
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 
+0

흠, 이것은 오류를 만들어 내지 못하고 있지만 다른 것을 생산하지도 않는다. myfile을 올바른 파일 이름으로 변경했지만 결과물이 출력되지 않는 것 같습니다. 나는 이것이 awnser라고 생각한다. 나는 계속 지킬거야. – edwardiglesias

+0

일부 디버깅을해야합니다. 루프 안에 @fields \ n "'인쇄하십시오. 코드를 정확히 복사 했습니까? 'scalar'가 없다면 '<$fh>'은 모든 데이터를 먹고 루프를 위해 아무것도 남기지 않을 것입니다. – Borodin

+0

아직 아무것도 얻지 못합니다. – edwardiglesias

관련 문제