On Wednesday 23 June 2004 18:51, Ferdinand Ihringer wrote:
Hallo,
On Wednesday 23 June 2004 18:06, Hannes Vogelmann wrote:
Hi,
Am Mit, 23 Jun 2004, schrieb Dominik Schopper:
ungef. lösungsansatz in perl:
[...]
Hmmm, macht teilweise schon das richtige, allerdings bringt es die Zeilen total durcheinander, weil es die Zeilen nach den Inhalten des jeweils ersten Feldes sortiert. Das sieht dann z.B. so aus:
0 646543 0 0 646638 0 1 636858 0 1 639937 0 10 643148 0 10 648916 0 100 641890 0 100 647527 0 1000 720644 0 1000 877545 0 1001 718964 0 1001 895110 0 1002 713754 0 1002 877844 0 1003 718324 0 1003 886145 0 1004 714798 0 1004 884013 0 1005 711439 0 1005 873382 0 1006 717328 0 1006 887898 0 1007 716662 0 1007 874269 0 1008 711683 0 1008 881582 0 1009 727464 0 1009 883066 0 101 638048 0
Die Zeilen müssen aber in der richtigen Reihenfolge bleiben, da der Zeilenindex auch eine physikalische Bedeutung in Bezug auf die beiden anderen Spalten hat. Mir ist aber schon nicht klar wo die Neusortierung stattfindet, beim Einlesen oder beim Zusammenfügen. Aber Danke schonmal für die Bemühungen. Ich muss mich wohl dochmal näher mit perl beschäftigen.
Die Neusortierung findet hier statt: foreach (sort keys %hash) # ^^^^ { print FOUT join($sep, $_, $hash{$_}), "\n"; }
Allerdings sortiert Perl in den Hashs auch schon vor. Entweder schreibt man sich also eine eigene Sortierfunktion, die sort übergeben wird, oder man nimmt eine andere Variante, die am besten nicht gleich die Daten in einen Hash einliest. Bei großen Dateien könnte das Probleme machen.
Also so abgewandelt, wenn ich alles richtig verstanden: #!/usr/bin/perl use strict; use warnings; # Dieses Skript geht davon aus, dass beide Dateien die selbe Zeilenlaenge # haben # Ausnahmen wie leere Zeilen ueberspringen koennte man noch einbauen. Außerdem # sollten die Daten in der selben Reihenfolge stehen. Das trifft, wenn ich alles # richtig verstand,, alles zu. # auch untested my $f1 = "/erste/datei"; my $f2 = "/zweite/datei"; my $sep = "separator"; # IFS my $fout = "/merged/datei"; open( F1, "< $f1") or die "cant open $f1: $!"; open( F2, "< $f2") or die "cant open $f2: $!"; open(FOUT, "> $fout") or die "cant write $fout: $!"; while (!(eof(F1) or eof(F2))) { #Zeilen einlesen und Umbrueche #entfernen my $f1l = <F1>; my $f2l = <F2>; chomp($f1l); chomp($f2l); # auseinanderschneiden am sep. my ($index1, $index2, @dat1, @dat2); ($index1,@dat1) = split(/$sep/, $f1l); ($index2,@dat2) = split(/$sep/, $f2l); #Die Indecie sollten gleich sein die "Das Script muss noch verbessert werden.\n" if $index1 != $index2; #Hier könnte man die Rechenoperation fuer die vierte Spalte durchfuehren #Alles in die neue Datei schreiben print FOUT join($sep, $index1, @dat1, @dat2),"\n"; } close F1; close F2; close FOUT; print "Fertig\n"; Wenn wirklich beide Dateien gleich viele Zeilen und in der selben Anordnung indiziert sind, geht das so und es wäre wesentlich speicherschonender. Ferdinand