Thread Perl log-file nach timestamps sortieren (2 answers)
Opened by Gast at 2008-09-12 00:05

topeg
 2008-09-12 01:14
#114557 #114557
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
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...

View full thread Perl log-file nach timestamps sortieren