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
13:56#May#23#4746#denmark.xml.gz#dk
13:56#May#23#7555#netherlands.xml.gz#nl
13:56#May#23#4725#greatbritain.xml.gz#gb
13:56#May#23#3494#norway.xml.gz#n
13:56#May#23#7705#finland.xml.gz#fin
13:54#May#23#19300#italy.xml.gz#i
13:56#May#23#11171#belgium.xml.gz#b
13:56#May#23#27772#sweden.xml.gz#s
13:56#May#23#62846#germany.xml.gz#d
13:54#May#23#19495#switzerland.xml.gz#ch
11:43#Apr#19#230#estonia.xml.gz#est
13:54#May#23#2848#austria.xml.gz#a
13:56#May#23#1530#luxembourg.xml.gz#l
13:56#May#23#18358#france.xml.gz#f
13:56#May#23#13415#greatbritian.xml.gz#uk
13:57#May#23#4746#denmark.xml.gz#dk
13:57#May#23#7672#netherlands.xml.gz#nl
13:57#May#23#4715#greatbritain.xml.gz#gb
13:57#May#23#3494#norway.xml.gz#n
13:57#May#23#7705#finland.xml.gz#fin
13:57#May#23#19777#italy.xml.gz#i
13:57#May#23#11230#belgium.xml.gz#b
13:57#May#23#27772#sweden.xml.gz#s
13:57#May#23#62485#germany.xml.gz#d
13:57#May#23#19446#switzerland.xml.gz#ch
11:43#Apr#19#230#estonia.xml.gz#est
13:57#May#23#2846#austria.xml.gz#a
13:57#May#23#1530#luxembourg.xml.gz#l
13:57#May#23#18358#france.xml.gz#f
13:57#May#23#13667#greatbritian.xml.gz#uk
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 $file_in='test.txt'; my $file_out='test.out.txt'; my %order; { open(my $fh, '<', $file_in) or die("ERROR open $file_in ($!)\n"); while(my $line=<$fh>) { if(my ($name)=$line=~/(\w+)\.xml\.gz/) { push(@{$order{$name}},$line); } } close($fh); } my @data; for my $arr (values(%order)) { shift(@$arr) while(@$arr>2); push(@data,@$arr); } { open(my $fh, '>', $file_out) or die("ERROR open $file_out ($!)\n"); print $fh @data; close($fh); }
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
!/usr/bin/perl use strict; use warnings; my $file_in='test.txt'; my $file_out='test.out.txt'; my @data; { open(my $fh, '<', $file_in) or die("ERROR open $file_in ($!)\n"); while(my $line=<$fh>) { push(@data,$line); if(my ($name)=$line=~/(\w+)\.xml\.gz/) { push(@{$order{$name}},$#data); } } close($fh); } for my $arr (values(%order)) { while(@$arr>2) { my $pos=shift(@$arr); splice(@data,$pos,1); } } { open(my $fh, '>', $file_out) or die("ERROR open $file_out ($!)\n"); print $fh @data; close($fh); }
2011-05-24T09:32:43 topegWenn die Reihenfolge egal ist:
2011-05-24T07:12:51 falke13wenn ich eine Datei mit folgendem Inhalt habe und möchte das z.B für jedes Land nur 2 Einträge gibt, also wenn denmark 3 mal drin sein sollte der erste Eintrag gelöscht wird und nur die letzten zu sehen ist. Gibt es in Perl eine Möglichkeit wie man das ganze am besten händeln kann.
1 2 3 4 5 6
my @lines = ...; # Ausgagsliste my %hits; # wieviele Einträge pro Land my @result = reverse # 4. zurück zur Ausgangs-Reihenfolge grep {/#(\w*)\.xml/; # 2. ländername extrahieren $hits{$1}++ <2} # 3. pro name die ersten 2 durchlassen reverse @lines; # 1. Reihenfolge umkehren
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
my @lines = ...; # Ausgagsliste my %hits; foreach my $l (@lines) { $l =~ m/#(\w+)\.xml/; push @{$hits{$1}},$l; # Hash land ->[line1,line2...] }; my @result; foreach my $k (keys %hits) { if (@{$hits{$k}} > 2) { push @result,@{$hits{$k}}[-2,-1]; # letzte 2 Einträge } else { push @result,@{$hits{$k}} # alle Einträge für land } };
Quotewenn denmark 3 mal drin sein sollte der erste Eintrag gelöscht wird und nur die letzten zu sehen ist
2011-05-24T09:55:04 topegDein Ansatz wirft die letzten Weg und behält die ersten. Das war nicht die Anforderung. ;-)