93578
Goto Top

Vor- und Nachnamen mit einem bestimmten Muster aus einer Textdatei löschen

Ok. Meine letzte Frage war ein bisschen undeutlich formuliert. Also hier ist ein neuer Versuch.

Ich habe drei Text-Dateien:

Datei 1 - eine Liste mit 30.000.000.000 Zeilen. In dieser Datei befinden sich teilweise einzelne Zeilen mit Vor- und Nachnamen von Mitarbeitern. Ich soll nun NUR diese Zeilen bereinigen/löschen und zwar NUR die, die folgenden acht Kriterien entsprechen:

Name Vorname
Name_Vorname
Name.Vorname
Name-Vorname
Vorname Name
Vorname_Name
Vorname.Name
Vorname-Name

Alle Zeilen, die NUR Vorname ODER NUR Nachname enthalten, sollen bleiben:

Vorname
Nachname

Ich habe nun 2 zusätzliche Textdateien generiert: "Vorname.txt" mit allen möglichen Vornamen und "Nachname.txt" - mit Nachnamen. Wie kann ich diese Dateien mit der ersten Datei abgleichen und alle Zeilen mit den oben genannten Muster löschen? Oder existiert eine einfachere Lösung?

Danke.

Takeshi

Content-Key: 308396

Url: https://administrator.de/contentid/308396

Ausgedruckt am: 28.03.2024 um 08:03 Uhr

Mitglied: 129813
Lösung 129813 28.06.2016 aktualisiert um 18:06:43 Uhr
Goto Top
This is my understanding right now:
#!/bin/bash
FILE_VORNAMEN="./Vorname.txt"  
FILE_NACHNAMEN="./Nachname.txt"  
FILE_DATA="./big_file.txt"  
FILE_DATA_CLEAN="./big_file_clean.txt"  
# --------------------
NUMROWS=$(cat "$FILE_VORNAMEN" | wc -l)  
REPLACE=''  
for l in $(seq 1 $NUMROWS) ;do
  vorname=$(sed "${l}!d" "$FILE_VORNAMEN")  
  nachname=$(sed "${l}!d" "$FILE_NACHNAMEN")  
  for t in ' ' _ . - ;do  
    REPLACE="$REPLACE|$nachname$t$vorname|$vorname$t$nachname"  
  done
done
REPLACE="${REPLACE:1}"  
sed -re "/$REPLACE/Id" "$FILE_DATA" >"$FILE_DATA_CLEAN"  
Regards
Mitglied: em-pie
em-pie 28.06.2016 aktualisiert um 18:34:45 Uhr
Goto Top
Hallo Takeshi,

wie stellts du sicher, dass in der Liste keine Doppel-Vor- oder Nachnamen enthalten sind?

Denn mit highloads Script würdest du die Zeilen löschen, die zwar nur den Vornamen (oder Nachnamen) enthalten, aber dennoch einen Bindestrich beinhalten; z.B. Lisa-Marie oder Meier-Müller

Gruß
em-pie
Mitglied: 93578
93578 28.06.2016 aktualisiert um 18:28:42 Uhr
Goto Top
Zum Glück habe ich dort keine doppelte Vor- oder Nachnamen. Sonst hätte ich ein Problem... Muss ich zuerst morgen auf der Arbeit testen. Danke für Hinweis!
Mitglied: tomolpi
tomolpi 28.06.2016 um 19:03:02 Uhr
Goto Top
Hallo @93578,

Ich habe das "Gelöst" vom Beitrag wieder entfernt, du schriebst du willst das morgen mal testen, also gehe ich davon aus, dein Problem ist noch nicht gelöst face-wink

Die Markierung bei @129813 lasse ich stehen, den anderen Thread mache ich nachher zu und Verweise auf diesen hier, normalerweise sind Doppelposts nicht so gerne gesehen face-smile

LG,

tomolpi
Mitglied: 93578
93578 29.06.2016 um 10:57:20 Uhr
Goto Top
Dein Script funktioniert nicht. Es wird keine big_file-clean.txt-Datei erstellt. ???
Mitglied: 129813
129813 29.06.2016 aktualisiert um 12:33:26 Uhr
Goto Top
Zitat von @93578:

Dein Script funktioniert nicht. Es wird keine big_file-clean.txt-Datei erstellt. ???
Sure it works, i testet it in a ubuntu vm...!
Mitglied: 93578
93578 29.06.2016 um 12:37:32 Uhr
Goto Top
Getestet mit Ubuntu. Script als sh ausgeführt und läuft durch. Es werden aber keine neue Dateien erstellt...
Mitglied: 93578
93578 29.06.2016 aktualisiert um 12:58:12 Uhr
Goto Top
Gut. Jetzt funktioniert (ich weiß es auch nicht warum es vorher nicht klappte) und big-file-clean.txt wird auch erstellt. Aber... Dort wird nichts aussortiert.

big-file.txt:

anton.ivanow
Igor Krasnow
antuan_updike
Heiz-Olaf Muster-Mann
Muster-Mann-Antuan
Max-Ivanow
antuan.updike
Andrey_Updike
Updike-andrey
Ivanow&Max
Max@Updike

big-file_clean.txt:

anton.ivanow
Igor Krasnow
antuan_updike
Heiz-Olaf Muster-Mann
Muster-Mann-Antuan
Max-Ivanow
antuan.updike
Andrey_Updike
Updike-andrey
Ivanow&Max
Max@Updike

Vorname.txt:
anton
Andrey
Igor
Max
Heinz-Olaf
antuan

Nachname.txt
Ivanow
Muster-Mann
Updike
krasnow

Es sollten doch nur die folgenden Zeilen bleiben:
Ivanow&Max
Max@Updike
Mitglied: 129813
129813 29.06.2016 aktualisiert um 16:26:15 Uhr
Goto Top
First: My script above is case sensitive!, but you can change this easily with the option I of sed (Line17).
I have updated the script above for you, now it is case insensitive ...

Second First and Lastname text files must have the same number of lines in the above script. For each first name must exist a lastname in the same line.

You said nothing about all combinations of first- and lastnames !! If this is your intention take this script:

#!/bin/bash
FILE_VORNAMEN="./Vorname.txt"  
FILE_NACHNAMEN="./Nachname.txt"  
FILE_DATA="./big_file.txt"  
FILE_DATA_CLEAN="./big_file_clean.txt"  
# --------
REPLACE=''  
while read vorname ;do
  while read nachname ; do
    for t in ' ' _ '\.' - ;do  
      REPLACE="$REPLACE|$nachname$t$vorname|$vorname$t$nachname"  
    done
  done < <(cat "$FILE_NACHNAMEN")  
done < <(cat "$FILE_VORNAMEN")  

REPLACE="${REPLACE:1}"  
sed -re "/$REPLACE/Id" "$FILE_DATA" >"$FILE_DATA_CLEAN"  
Please, next time be more precise with your description, thank you.

If you need more tweaking of the script, you can contact me, but this won't be free of charge.

Regards
Mitglied: 93578
93578 29.06.2016 aktualisiert um 18:04:40 Uhr
Goto Top
Vielen Dank, highload, für deine Mühe!

Das Problem: die Mitarbeiter tragen sich so ein, wie sie es wollen. Einzelne Regeln sind:

1) Es muss immer ein Name und Vorname sein.
2) Diese müssen durch "-", "_", ".", " " getrennt werden.

Es gibt z.B. meherere MA, die "Klaus" heißen, haben aber verschiedene Nachnamen oder MA, die "Scmidt" heißen, haben aber verschiedene Vornamen, deswegen haben die Wörterbücher "Vorname" und "Nachname" unterschiedliche Größe/Zeilenanzahl.

Doppelte Namen/Vornamen haben wir nicht, aber ich habe diese testweise ausprobiert.

Das Ergebnis mit dem Script Nr.2 ist gleich. Die beide Dateien "big_file.txt" und "big_file_clean.txt" sind IDENTISCH. Irgendwas klappt dort nicht.

Ich habe alle drei Dateien jetzt so geändert:

Vorname.txt:
Anton
Andrey
Igor
Max
Antuan

Nachname.txt:
Ivanow
Mustermann
Updike
Krasnow

big_file.txt:
Anton.Ivanow
Igor Krasnow
Antuan_Updike
Mustermann-Antuan
Max-Ivanow
Antuan.Updike
Andrey_Updike
Updike-Andrey
Ivanow&Max
Max@Updike

Die Zeilennummer habe ich dort selbstverständlich nicht! Sie werden durch Code-Tag in Forum automatisch eingefügt.
Es sollen eigentlich nur "Ivanow&Max" und "Max@Updike" in der Datei "big_file_clean.txt" bleiben. Stattdessen habe ich dort nach wie vor alle Zeilen aus der Datei "big_file.txt"....

Kannst Du es mit meinen txt-Dateien reproduzieren?

Danke.
Takeshi.

PS: Sorry, Linux ist nicht meine Welt und Windows kann mit solchen riesigen Dateien nicht umgehen bzw. es wird ewig dauern...
Mitglied: 129813
Lösung 129813 29.06.2016 aktualisiert um 20:32:10 Uhr
Goto Top
Kannst Du es mit meinen txt-Dateien reproduzieren?
Absolutely no, I tested it exactly with your posted data after i wrote the second script and the result is what you expect, sorry it works!
Ivanow&Max 
Max@Updike
Perhaps your files have uncommon encoding or you are doing something totally wrong, like the first time ...

PS: Sorry, Linux ist nicht meine Welt
Go and learn ...Everyone has started one time.
Windows is making the people stupid.
und Windows kann mit solchen riesigen Dateien nicht umgehen bzw. es wird ewig dauern...
That's bullshit, sorry.

So, have a nice time learning the bash face-wink, i can't teach you all, that takes way to much time face-wink

Regards
highload
Mitglied: 93578
93578 30.06.2016 um 09:37:07 Uhr
Goto Top
Entschuldige, aber dein Script funktioniert nicht. Auch mein Bekannter, der sich eigentlich mit Linux auskennt und auch einfache Skripte schreibt, hat gestern abend dein Script angeschaut und könnte gar nicht nachvollziehen was der macht. Bei Ausführung kommt immer Hinweis, dass irgendwas mit "cat"-Befehl nicht in Ordnung ist.

OK. Aber trotzdem danke. Ich werde dann doch andere Wege suchen. face-wink
Mitglied: 129813
129813 30.06.2016 aktualisiert um 09:52:06 Uhr
Goto Top
I can show you a video that it works, if you want...
Mitglied: 93578
93578 30.06.2016 aktualisiert um 10:02:54 Uhr
Goto Top
Nein danke. Linux ist nichts für mich - bin fast 55 Jahre alt. Es ist ein bisschen spät zum Lernen. Zurück zum PowerShell und cmd.. face-smile
Mitglied: 129813
129813 30.06.2016 aktualisiert um 10:34:10 Uhr
Goto Top
demo.mp4

bin fast 55 Jahre alt. Es ist ein bisschen spät zum Lernen.
it's never too late. My father is 65, has worked for many years and now makes another apprentice because now he has the required time for it. Life is learning until death!