Zum Inhalt springen

PERL Problem mit doppelten Einträgen


Empfohlene Beiträge

Hi,

hab hier ein Textfile in dem 3000 Nummern drinstehen. eine Nummer Pro Zeile, also ca. so:

AT96986986

AT96234434

AT96749078

AT93242356

AT04790777

...

nun kann es sein, dass 2 mal die gleiche nummer untereinandersteht. die doppelten nummern sollen in eine weitere textdatei geschrieben werden.

hier mal mein skript:

#!/usr/bin/perl -w

$i = "0";

$j = "1";

$file = "doppelte2.txt";

$file2 = "doppelte_perl.txt";

open (FILE, $file) || die("Kann $file nicht oeffnen!\n");

while(<FILE>)

{

push @elemente, $_;

}

open (FILE2, $file2) || die("Kann Datei nicht anlegen\n");

while (@elemente)

{

if ($elemente[$i] eq $elemente[$j])

{

print FILE2 "$elemente[$i]\n";

$i++;

$j++;

}

}

close (FILE);

close (FILE2);

print "Done!\n";

das skript startet zwar, kommt aber zu keinem ende irgendwie :)

Erros hab ich keine...

Hab ich irgenwo nen Fehler drin? bin echt ratlos :confused:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

wenn du eine Shell hast:

#> cat $datei | perl -ne 'print if ($seen{$_}++)' > $doppelte

wenn du keine Shell hast:

#!/usr/bin/perl -w

%seen = ();

$file = "nummern.txt";

$file2 = "doppelte.txt";

open (FILE, "<$file") || die("Kann $file nicht oeffnen!\n");

open (FILE2, ">$file2") || die("Kann $file2 nicht oeffnen!\n");

while(<FILE>){

print FILE2 if ($seen{$_}++);

}

In FILE2 sind jetzt alle doppelten Einträge. Allerdings ungeordnet.

Aber das Skript sieht hübscher aus ;)

viel Spaß

taschentoast

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi taschentoast,

bin nicht DER Perl Gott :)

Ich auch nicht, aber mit Perl kann man so lustige Schweinereien machen :)

für mich sieht das schon ein bissal obfuscated aus ;)

kannst mir vielleicht die zeilen mal kommentieren, was die genau machen ?

also zumindest das in der while schleife?

Logisch. Mach ich heut abend (so ab 1800), wenn ich zuhaus bin. Im Moment is zuwenig Zeit.

bis dahin 2 Stichworte: Magical Autoincrement. :D

Ich meld mich wieder

taschentoast

Link zu diesem Kommentar
Auf anderen Seiten teilen

So dann wollen mir mal.

Man möge mir evtl technisch ungenaue Formulierungen entschuldigen, nur das Prinzip ist wichtig :)

#!/usr/bin/perl -w

%seen = (); # initialisiere hash

$file = "nummern.txt";

$file2 = "doppelte.txt";

open (FILE, "<$file") || die("Kann $file nicht oeffnen!\n"); # $file für "nur-lesen" öffnen

open (FILE2, ">$file2") || die("Kann $file2 nicht oeffnen!\n"); #$file2 für "nur schreiben" öffnen

while(<FILE>){ #solange Zeilen von FILE eingelesen werden können, tue:

print FILE2 if ($seen{$_}++); #das hier. siehe unten.

}

was macht "print FILE2 if ($seen{$_}++);"?

++ ist hier ein sog. "magical autoincrement", d.h. erhöhe das was links vom ++ steht, oder lass es. Ausgeschrieben ist das nix anderes als "$seen{$_} = $seen{$_} + 1" (im String-Kontext wird binär erhöht).

Näxter Punkt:

Mit $seen{$_} wird in den hash %seen ein Schlüssel/Wert-Paar geschrieben, mit Schlüssel=$_ (sprich, der aktuell eingelesenen Zeile) und Wert=undef (hoffentlich! weiß einer mehr? ;) ).

Jetzt kommt das "magical".

Das if prüft: "Konnte ich den Wert, der dem Schlüssel $_ zugeordnet ist erhöhen?". Das geht natürlich nur, wenn schon ein Schlüssel/Wert-Paar existiert. Also gibt die Bedingung true zurück, wenn erhöht werden konnte, und false, wenn nicht erhöht werden konnte (außerdem wird noch $_ als Schlüssel/Wert in den hash eingetragen für die nächste Überprüfung).

Danach kommt nur noch standard Perl. In der Langform:

if($seen{$_}++){ #wenn true

print FILE2 "$_"; #gib in Filehandle FILE2 $_ (die aktuell eingelesene Zeile) aus

}

Fertig. Alles verständlich soweit? :D

taschentoast

Link zu diesem Kommentar
Auf anderen Seiten teilen

So dann wollen mir mal.

Man möge mir evtl technisch ungenaue Formulierungen entschuldigen, nur das Prinzip ist wichtig :)

#!/usr/bin/perl -w

%seen = (); # initialisiere hash

$file = "nummern.txt";

$file2 = "doppelte.txt";

open (FILE, "<$file") || die("Kann $file nicht oeffnen!\n"); # $file für "nur-lesen" öffnen

open (FILE2, ">$file2") || die("Kann $file2 nicht oeffnen!\n"); #$file2 für "nur schreiben" öffnen

while(<FILE>){ #solange Zeilen von FILE eingelesen werden können, tue:

print FILE2 if ($seen{$_}++); #das hier. siehe unten.

}

was macht "print FILE2 if ($seen{$_}++);"?

++ ist hier ein sog. "magical autoincrement", d.h. erhöhe das was links vom ++ steht, oder lass es. Ausgeschrieben ist das nix anderes als "$seen{$_} = $seen{$_} + 1" (im String-Kontext wird binär erhöht).

Näxter Punkt:

Mit $seen{$_} wird in den hash %seen ein Schlüssel/Wert-Paar geschrieben, mit Schlüssel=$_ (sprich, der aktuell eingelesenen Zeile) und Wert=undef (hoffentlich! weiß einer mehr? ;) ).

Jetzt kommt das "magical".

Das if prüft: "Konnte ich den Wert, der dem Schlüssel $_ zugeordnet ist erhöhen?". Das geht natürlich nur, wenn schon ein Schlüssel/Wert-Paar existiert. Also gibt die Bedingung true zurück, wenn erhöht werden konnte, und false, wenn nicht erhöht werden konnte (außerdem wird noch $_ als Schlüssel/Wert in den hash eingetragen für die nächste Überprüfung).

Danach kommt nur noch standard Perl. In der Langform:

if($seen{$_}++){ #wenn true

print FILE2 "$_"; #gib in Filehandle FILE2 $_ (die aktuell eingelesene Zeile) aus

}

Fertig. Alles verständlich soweit? :D

taschentoast

Jetzt weiss ich warum ich mich vor 2 Jahren hingesetzt hab und PHP gelernt hab anstatt Perl.

Das sieht ja alles aus wie Kraut und Rüben,... :floet:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jetzt weiss ich warum ich mich vor 2 Jahren hingesetzt hab und PHP gelernt hab anstatt Perl.

Das sieht ja alles aus wie Kraut und Rüben,... :floet:

Wieso anstatt? Perl ist keine Alternative zu PHP und umgekehrt.

Die Grundfunktionen die beide Sprachen erfüllen sollen sind absolut verschieden und somit nicht vergleichbar. Dass PHP und Perl gelegentlich für Dinge "missbraucht" werden, für die sie nicht gedacht sind, sollte einen selber nicht abhalten, das richtige Werkzeug für das Problem zu wählen. Und in dem Fall war meines Erachtens Perl am besten geeignet. :)

Und zu dem "Kraut und Rüben":

Für mich sieht schlampige PHP-Programmierung auch aus wie Kraut und Rüben. :D

Perl ist eben die Antwort, nur die Frage kennt man oft nicht ;)

auf eine friedliche Koexistenz von Perl und PHP :)

taschentoast

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wieso anstatt? Perl ist keine Alternative zu PHP und umgekehrt.

Naja also in meinem Fall waren Perl und PHP die alternativen die ich zur Auswahl hatte, da es "nur" um Webserverprogramierung gegangen ist.

Und zu dem "Kraut und Rüben":

Für mich sieht schlampige PHP-Programmierung auch aus wie Kraut und Rüben. :D

Das ist sicherlich richtig, schlampige programierung sieht immer aus wie Kraut und Rüben ;)

Aber ich bin davon ausgegangen, dass das o.g. Beispiel ordentlich programiert ist und es sieht für mich destotrotz aus wie Kraut und Rüben ;D. (Mag auch daran liegen, dass ich noch nie mit Perl gearbeitet habe...)

Perl ist eben die Antwort, nur die Frage kennt man oft nicht ;)

PHP wäre ebenfalls eine Antwort auf diese komische Frage gewesen :-)

auf eine friedliche Koexistenz von Perl und PHP :)

dito

taschentoast

kills :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...