Hi EagleFox,
hmm, habe Deinen ersten Beitrag hierzu wohl gelesen, aber nur halb verstanden.
Habe mir auch keine grossen Gedanken um das Mitteln an sich gemacht (also 1.
Zeile jedes Datenblocks miteinander, jede 2., etc.).
Ich würde sagen, vergiss meine erste Variante ;o)
Hier ist ein neuer Lösungsansatz (allerdings setzt der ein paar Annahmen
voraus, die sich aber - glaub ich - recht einfach einrichten lassen):
Hier zunächst mal der Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/usr/bin/perl
use strict;
use warnings;
my @wert = ();
my $cnt = 0;
# zeilenweise einlesen
while ( <DATA> ) {
# 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
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!