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?
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?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
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
5 Kommentare
Neuester Kommentar
Hallo Jeduja,
hiermit solltest du klar kommen:
Ergebnis:
Grüße Uwe
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);
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
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 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?
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);
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
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.