• ベストアンサー

各クラスの平均身長・体重を計算するスクリプト

標記の件で、至急困っています。 perl でも awk でも良いので次のようなスクリプトを教えてください。 ぜひお願いします!!Linux上で作業をやることになってます。 1年生の各クラスの生徒のデータは、クラスごとに 1/class1 1/class2 1/class3 1/class4 1/class5 のように学年を表す数字のディレクトリに データファイルが入っています。 2年生のデータも同様で、 2/class1 2/class2 ・・・ 2/class4 2/class5 のような感じです。 各学年5クラスで、全部で6学年あります。 各クラス、だいたい生徒が40人くらいで、 データファイル class* には、身長、体重が 山田 131 23 高橋 135 24 ・・・ のように記録されています。 以上のデータを各クラスごとに平均を計算して、 1-nen 1-kumi 125.3 20.5 1-nen 2-kumi 120.2 18.9 ... 6-nen 5-kumi 140.6 44.9 のような出力を得るにはどうすればよいでしょうか? よろしくおねがいいたします!

  • Perl
  • 回答数4
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

> $path =~ m|(\d)/class(\d)|; について 変数 =~ m/パターン/; で変数とパターンのマッチングを行います。 m//の替わりにm||を使っているのは、 パターンの中で / を使っているためです。 m/パターン1/パターン2/ のようには書けないので m/パターン1\/パターン2/ のようにする必要があるんですが、紛らわしいです。 そういう場合、m//をm||で代替できます 1/class2 と (\d)/class(\d) をマッチングすると (\d)が数字の部分とマッチします。 マッチしたものは、それぞれ $1,$2に順番に入ります つまり例の場合 $1=1,$2=2 になります

white-tiger
質問者

補足

> 1/class2 と (\d)/class(\d) をマッチングすると > (\d)が数字の部分とマッチします。 > マッチしたものは、それぞれ > $1,$2に順番に入ります 衝撃を受けました。便利ですね。 ありがとうございます!

その他の回答 (3)

  • Hasty
  • ベストアンサー率73% (19/26)
回答No.4

> /(\d)/g > の\dとgの意味 ここでは「1/class1」などの文字列が入っているはずの特殊変数$_から、正規表現で年と組を取り出しています。 「\d」は正規表現の数字を表すメタ文字で、「g」はマッチするものを全部取り出すというオプションです。 > or die "$!: $_"; > "$!: $_" の役割 「$!」にはopenが失敗した理由(エラーメッセージ)が入っていて、「$_」にはファイル名が入っています。つまり、openが失敗した理由と、開けなかったファイル名を表示するようにしています。 or die "ファイルが開けませんでした"; のように書いてもいいんですが、これだと何で開けなかったのか、どのファイルが開けなかったのか、などが分からないのでこの様にしてます。

white-tiger
質問者

補足

一気に成長できました。 ありがとうございます!

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

sub ave ($){ my $path = shift; my (@field, $sumH, $sumW, $count); unless(open(F, $path)){ warn "Can't open $path\n"; return ; } while(<F>){ @field = split; $sumH += $field[1]; $sumW += $field[2]; $count++; } close(F); $path =~ m|(\d)/class(\d)|; printf("%d-nen%d-kumi %4.1f %3.1f\n",$1,$2,$sumH/$count,$sumW/$count); } for($nen=1;$nen<=6;$nen++){ for($kumi=1;$kumi<=5;$kumi++){ ave("./$nen/class$kumi"); } }

white-tiger
質問者

補足

ありがとうございます! > $path =~ m|(\d)/class(\d)|; について教えていただけないでしょうか? 特に ~ と | と \d の役割が・・

  • Hasty
  • ベストアンサー率73% (19/26)
回答No.1

こんな感じ。 foreach (sort glob("?/class?")) { my ($nen, $kumi) = /(\d)/g; my ($height, $weight); open FH, $_ or die "$!: $_"; while (<FH>) { my @part = split /\s/; $height += $part[1]; $weight += $part[2]; } printf "%d-nen %d-kumi %.1f %.1f\n", $nen, $kumi, $height/$., $weight/$.; close FH; } 分からないとこがあれば補足下さい。

white-tiger
質問者

補足

ありがとうございます! このコードを参考にネットでいろいろ勉強してみましたが、 ・ /(\d)/g の\dとgの意味と、 ・or die "$!: $_"; "$!: $_" の役割 を教えていただけないでしょうか?

関連するQ&A

  • ドロップダウンリストの値の足し合わせ(子ども向け)

    お世話になります。はじめて質問させて頂きます。 このたび、ドロップダウンリストを用いて、子どもでもホームページ(データベース)にアクセスできるユーザインターフェースを作りたいと考えております。具体的には、階層化されたデータベースにドロップダウンリストで項目を選ぶことによりURLアドレスを作り出し、[Go]ボタンでアクセスできるようにしたいと考えています。 (例)データーベース http://www.aa.bb.jp/(学年)/(クラス)/(データファイル) (学年ディレクトリ)1nen,2nen,3nen,・・・ (クラスディレクトリ)1kumi,2kumi,3kumi,・・・ (データディレクトリ)a.jpg,b.jpg,3.jpg,・・・ といった階層化されているものがあったとき、ドロップダウンリストを [学年]  1年  2年  3年 [クラス]  1組  2組 [データ]  1  2  3 と作り、学年ドロップダウンリストで、 (例)http://www.aa.bb.jp/1nen まで作り出し、クラスドロップダウンリストで、  (例)http://www.aa.bb.jp/1nen/2kumi まで作り出し、最後のデータドロップダウンリストで、 (例)http://www.aa.bb.jp/1nen/2kumi/3.jpg までのアドレスが完成し、[Go]ボタンでHPを表示させるようなものです。なお、アドレス生成の途中過程は表示の必要はありません。 http://www.aa.bb.jp/の部分は前置文字列で共通部分です。 わかりにくい説明かとは思いますが、ご教示頂ければ幸いです。 よろしくお願い致します。

  • 構造 他のクラスの構造体を別のクラスで使いたい。

    C#で以下のようにCls1で定義している構造体をCls2の引数に使いたいのですが 定義されていないエラーになります。 Cls2で再定義すると、同じものが2つできて修正するときに困りそうです。 プログラムの構造について、何か良い方法がありましたら教えてください。 namespace A { class Cls1 { public struct Kumi { public string name; public int age; } private test(){ Kumi k; k.name = "太郎"; k.age = 5; Cls2 c2 = new Cls2(); c2.Write(k); } } } 別のクラスファイル namespace A { class Cls2 { public Write(Kumi k){ } } }

  • きちんとクラス構造のできた掲示板のスクリプトがほしい

    現在、PHPで掲示板を作成しようと思っていますが、大前提として「オブジェクト指向であること」と考えています。(意味が正確に理解できているかどうかは置いておいてください汗) たとえば、 class Thread { ....... } class Message { ....... } class BBS { ....... } class Container { ....... } class View { ....... } とクラスを作成して、掲示板を作りたいのですが、いかんせん、どうしたらよいのか検討もつきません。。 ので、サンプルがあればそれを見て勉強したいとも思ったのですが、なかなか見つかりません。大体が、ヒアドキュメントを用いていたり、ファイルorデーターベースにしかデーターを保存できなかったりと、そのようなものしかありません。「しっかり」とはしてなくてもよいので、なにか参考になるWebやスクリプトはありませんでしょうか?ご存知でしたら教えてください。よろしくおねがいします。

    • 締切済み
    • PHP
  • クラスファイルについて

    javaで例えばjavac Test.javaと打ち込むとコンパイルできディレクトリにTest.classというファイルができるのにもかかわらず、java Test と打ち込むとエラーがでてしまいます。クラスの定義がないみたいな感じででてきてしまいます。コマンドプロンプトのdir Testr.classと入力しても確かにファイルは存在しているのですが・・・。なぜなのでしょうか?

  • クラスの扱い方について

    生徒をグループ分けするとします。 しかし、ここでのグループ分けとは、先生が好きな生徒グループ、先生の指示をよく聞くグループ、など先生の偏見でグループ分けされるので複数のグループに所属する生徒はザラに存在します。 このとき、グループのクラスを作ってまとめたいのですが、扱い方がよく分かりません。 クラスって グループ1 > 生徒A 、生徒B、 生徒C 、 生徒D グループ2 > 生徒A 、生徒C グループ3 > 生徒A 、生徒F グループ4 > 生徒C 、生徒F のような構造つくれますか? public class group { public String group_name;←この中に生徒のリスト←(goup_list)を作りたい } フォルダのなかに複数ファイルが入っているイメージです。 (生徒のクラスを作って生徒それぞれに情報を書き込むという方法以外で考えています。) よろしくお願いします。 初心者なんで、複雑なアルゴリズムは避けて下さい。

    • ベストアンサー
    • Java
  • publicクラス

    クラスの修飾子にpublicをつける理由を教えて下さい。 さらに、なにも修飾子をつけなときは 同一パッケージ(ファイル)内からでしかアクセスできないはずですよね? Test.javaとBase.javaを以下のように定義します。 class Test { public static void main(String[] args) { Base b = new Base(); } } class Base { public void show() { System.out.println("hello!"); } } この2つのファイルは同じディレクトリにあります。 public修飾子をつけていないにも関わらず、なぜインスタンス化ができるのでしょうか? よろしくおねがいします。

    • ベストアンサー
    • Java
  • クラスファイルの配置について

    初めまして。 質問したいことがあります。 私の環境は OS:RedHatLinux7.2 JDK:1.3.0_02 Tomcat:ver3.2.4 です。 servletの動作について (1)tomcat/WEB-INF/test/classes/hello.class ("HelloWorld"という文字列を表示するクラス)で  アドレス→http://localhost:8080/test/servlet/helloと入力すると正常に動 作しました。 次に (2)tomcat/WEB-INF/test/classes/sample/hello.class ("HelloWorld"という文字列を表示するクラス)で  アドレス→http://localhost:8080/test/servlet/sample/helloと入力すると Error 500 Internal Servlet Errorというエラーが発生しました。 server.xmlには <Context path="/test"    docBase="webapps/test"    crossContext="false"    debug="0"    reloadable="true" > </Context> を追加しているだけなのですが、Tomcatではクラスファイルは絶対にclassesディレクトリの直下に配置しなければならないのでしょうか? (2)のclasses-sample-hello.classというように、classesディレクトリとクラスファイルの間にディレクトリが存在すると駄目なのでしょうか? もし何かわかることがありましたらご教授御願い致します。

    • ベストアンサー
    • Java
  • perlのクラスについて

    perlでクラスを作成しています。その際、コンストラクタnewで無名配列を定義して、funcメソッドで、この無名配列に値をいれるにはどうすればよいでしょうか? sub new { my $class = shift; my $self->array = []; bless($self, $class); return $self; } sub func { my $self = shift; $self->arrayに配列のデータを入れる。 }

    • ベストアンサー
    • Perl
  • クラス替え

    私の娘が今、中学1年です。2年生に上がる時にクラス替えをすると学校からプリントが届きました。娘の中学は十年以上クラス替えをしていません。理由はよく知りませんが・・・ですから娘が入学した時も3年間クラス替えが無いのを前提にクラス役員も3年間決めたのです。ところが保護者にも一言も無しにプリント1枚、1年生も残り1か月という時にこのクラス替えの知らせ、保護者は勿論、子供達の戸惑いと言ったらありません。泣き出す子、校長室に抗議に行く生徒たちそんな生徒たちに「次元が低い」だの「うざい」だの学年主任の言葉、教育者の言葉とは思えません。クラス替えは当たり前のことだけど何年もしてなかったのだから事前に保護者会を開いてくれたら反対する人もいなかったのでは・・この学校の態度どう思いますか?

  • クラスを使ったphpファイル間のデータの受渡し

    質問させていただきます。 クラスを使ったphpファイル間のデータの受渡しはできるのでしょうか。 (MVCの様なもの?) データのが多いのでhtml のrequestだと時間がかかるためです。 file_a.php :class.phpを呼び出して、ファイル中のクラスclass_hogeに値を格納 file_b.php :class.phpを呼び出して、file_a.phpで格納した値をclass_hogeから取り出す。 フレームワーク等は、使用しておりません。 ご助言お願いいたします。 失礼します。

    • ベストアンサー
    • PHP