Thread Perl log-file nach timestamps sortieren
(2 answers)
Opened by Gast at 2008-09-12 00:05
Anhand deines Beispieles:
Die kurze Version (langsam, Speicherhungrig) Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #!/usr/bin/perl use strict; use warnings; my @data=<DATA>; @data=sort{my($aa)=$a=~/^(\d+)/; my ($bb)=$b=~/^(\d+)/; $aa <=> $bb}@data; print join('',@data)."\n"; __DATA__ 0001 Ein Eintrag 0002 Noch ein Eintrag 0008 Ein weiterer Eintrag 0003 Und alles auch noch durcheinander 0008 Und aufgrund der geringen Auflösung auch noch gleiche timestamps 0010 Und es geht immer so weiter... Oder schneller, mit weniger Speicherverbrauch: Code (perl): (dl
)
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 #!/usr/bin/perl use strict; use warnings; my @array=(); my $pos=tell(DATA); while(my $line=<DATA>) { my ($time)=$line=~/^(\d+)/; push(@array,[$time,$pos]); $pos=tell(DATA); } for my $p (sort{$a->[0] <=> $b->[0]}@array) { seek(DATA,$p->[1],0); my $line=<DATA>; ### AUSGABE ### print $line; } __DATA__ 0001 Ein Eintrag 0002 Noch ein Eintrag 0008 Ein weiterer Eintrag 0003 Und alles auch noch durcheinander 0008 Und aufgrund der geringen Auflösung auch noch gleiche timestamps 0010 Und es geht immer so weiter... und noch eine Möglichkeit (recht schnell aber Speicherhungrig): Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #!/usr/bin/perl use strict; use warnings; my @data=map{$_=~/^(\d+)/;$_=[$1,$_]}(<DATA>); @data=sort{$a->[0] <=> $b->[0]}@data; for my $p (@data) { print $p->[1]; } __DATA__ 0001 Ein Eintrag 0002 Noch ein Eintrag 0008 Ein weiterer Eintrag 0003 Und alles auch noch durcheinander 0008 Und aufgrund der geringen Auflösung auch noch gleiche timestamps 0010 Und es geht immer so weiter... |