jeduja
Goto Top

Mit Perl aus einer Datei teilidentische Zeilen löschen

Ausgangsbasis Dateizeilen:

2016-05-23 00:00 2 Ende
2016-05-23 00:00 2 Start
2016-05-23 06:46 1 Ende
2016-05-23 06:48 1 Start
2016-05-23 07:09 1 Ende
2016-05-23 07:10 1 Start
2016-05-23 07:13 1 Ende
2016-05-23 07:41 1 Start
2016-05-23 08:18 1 Ende
2016-05-23 08:23 1 Start
2016-05-24 00:00 2 Ende
2016-05-24 00:00 2 Start
2016-05-24 04:00 1 Ende
2016-05-24 04:10 1 Start
2016-05-24 06:18 1 Ende
2016-05-24 07:24 1 Start
2016-05-24 09:56 1 Ende
2016-05-24 09:56 1 Start
2016-05-24 10:00 1 Ende
2016-05-24 10:07 1 Start

Die Datei enthält Datums- und Zeitangaben und ergänzende Infos.
Ist ein Datums- und Zeitwert 2x in einer Datei vorhanden (z.B. 2016-05-23 00:00)
sollen beide Zeilen komplett aus der Datei entfernt werden.
Wie kann das mit Perl-Mitteln realisiert werden?

Content-ID: 314585

Url: https://administrator.de/forum/mit-perl-aus-einer-datei-teilidentische-zeilen-loeschen-314585.html

Ausgedruckt am: 27.12.2024 um 01:12 Uhr

colinardo
colinardo 07.09.2016 aktualisiert um 13:03:56 Uhr
Goto Top
Hallo Jeduja,
hiermit solltest du klar kommen:
#!/usr/bin/perl
use File::Slurp;
use Array::GroupBy;
# Pfad zur Datei
my $fileIN = "test.txt";  
# Pfad zur Ausgabedatei
my $fileOUT = "test_out.txt";  
# Datei in Array einlesen
my @array = read_file($fileIN);
# iter Funktion für den Vergleich von Array-Elementen
my $iter = igroup_by(
			data => \@array,
			compare => sub {(split(/ /,$_),3)[0,1] eq (split(/ /,$_[1]),3)[0,1]},
		);
# ziel-array ohne identische Zeilen
my @result;
# GroupBy Funktion aufrufen und nur Elemente ins Zielarray schreiben die keine Duplikate haben
while(my $b = $iter->()){
	if (!$b->[1]){
		push(@result,$b->);
	}
}
# write result array to file
open(FILE,"> $fileOUT");  
print FILE @result;
close(FILE);
Ergebnis:
2016-05-23 06:46 1 Ende
2016-05-23 06:48 1 Start
2016-05-23 07:09 1 Ende
2016-05-23 07:10 1 Start
2016-05-23 07:13 1 Ende
2016-05-23 07:41 1 Start
2016-05-23 08:18 1 Ende
2016-05-23 08:23 1 Start
2016-05-24 04:00 1 Ende
2016-05-24 04:10 1 Start
2016-05-24 06:18 1 Ende
2016-05-24 07:24 1 Start
2016-05-24 10:00 1 Ende
2016-05-24 10:07 1 Start
Grüße Uwe
Jeduja
Jeduja 07.09.2016 um 13:11:02 Uhr
Goto Top
Hallo und vielen Dank!
Kann das leider noch nicht ausprobieren, da mir die aufgeführten CPAN-Module fehlen und das bei uns in der Firma immer so
ein Problem ist.
Ohne zusätzliche Module gibts keine Lösung?
colinardo
Lösung colinardo 07.09.2016 aktualisiert um 18:13:12 Uhr
Goto Top
Zitat von @Jeduja:
Hallo und vielen Dank!
Kann das leider noch nicht ausprobieren, da mir die aufgeführten CPAN-Module fehlen und das bei uns in der Firma immer so
ein Problem ist.
Das sind doch Standard-Module, die in den REPOs liegen also schnell eingerichtet. Mach mal Druck face-wink
Ohne zusätzliche Module gibts keine Lösung?
Geht auch:
#!/usr/bin/perl
# Pfad zur Datei
my $fileIN = "test.txt";  
# Pfad zur Ausgabedatei
my $fileOUT = "test_out.txt";  

my @array = do {
    open my $fIN, "<", $fileIN or die "could not open $fileIN: $!";  
    <$fIN>;
};
close($fIN)
my @result;
for(my $i;$i < @array;$i++){
	if ((split(/ /,$array[$i],3))[0,1] ne (split(/ /,$array[$i+1],3))[0,1]){
		push(@result,$array[$i]);
	}else{
		$i += 1;
	}
}
# write result array to file
open(FILE,"> $fileOUT");  
print FILE @result;
close(FILE);
Grüße Uwe

Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
colinardo
colinardo 11.09.2016 um 18:13:02 Uhr
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.
Jeduja
Jeduja 16.09.2016 um 10:26:43 Uhr
Goto Top
Herzlichen Dank! Damit klappt es prima.