#!/usr/bin/perl use strict; use warnings; my @wert = (); my $cnt = 0; # zeilenweise einlesen while ( ) { # Zeilenumbruch entfernen chomp; # ANNAHME: eine (und nur eine) Leerzeile trennt die Datenbloecke if ( $_ =~ m/^\s*$/ ) { # also erhoehen wir den Blockzaehler $cnt++; } else { # ANNAHME: erstes Feld nummeriert das Datenfeld, dann folgen Daten my ($row, @val) = split(); # wenn fuer Feldnr. noch nichts eingetragen, uebernehme die Daten # Struktur ist ein Array-of-Array if ( !exists($wert[$row]) ) { $wert[$row] = [ @val ]; } # Wenn Feldnummer schon bekannt, addiere Werte # ANNAHME: jeder Datenblock enthaelt die gleiche Anzahl Datenzeilen # und auch jede Feldnr ist entsprechend vorhanden else { foreach ( 0 .. $#{$wert[$row]} ) { $wert[$row]->[$_] += $val[$_]; } } } } # ANNAHME: der letzte Datenblock endet _nicht_ mit einer Leerzeile! # ansonsten ist $cnt hinterher um eines zu hoch! $cnt++; # Ausgabe gezaehlte Datenbloecke print "$cnt Datenbloecke", $/; # fuer jede Datenzeile; Start- und Ende-Wert koennen ja angepasst werden # oder auch variabel gestaltet werden ( 1000 .. 1050 oder $von .. $bis ) for ( 0 .. $#wert ) { # undefinierte Werte überspringen; z.B. bei Index 0 next unless defined( $wert[$_] ); # fuer jeden Datenwert for ( @{$wert[$_]}) { # berechne das Mittel und uebernehme es $_ = $_ / $cnt; } # gebe die Datenzeile aus printf( "%6d " . ( "%9.1f " x scalar( @{$wert[$_]} ) ) . "\n", $_, @{$wert[$_]} ); } __DATA__ 1 5.9 10.1 2 7.1 10.2 3 8.8 9.9 4 9.1 10.1 1 6.1 10.3 2 7.3 10.1 3 9.0 9.9 4 9.6 10.3