Cruiser
Anmeldungsdatum: 29. März 2010
Beiträge: 30
|
Hallo! Ich habe ein Problem, und zwar habe ich hier eine Liste mit Vor und Nachnamen. Bei dieser soll der Vor mit dem Nachnamen ausgetauscht werden und das Komma entfernt. Wie kann ich das in der Konsole bewerkstelligen??? Und um den Schwierigkeitsgrad noch zu steigern sind schon teilweise "richtig sortierte" Namen drin. Am Ende soll alles nach dem Shema "Vorname Nachname" sein.
Aber überall, wo die Namen falsch sortiert sind, ist ein Komma als Trennung vorhanden! Nach folgendem Shema: (Eingabeliste im TXT-Format) Müller, Maik
Stefan Keller
Schmidt, Daniel
Schulze, Richard
Ralf Schubert Und so soll die Ausgabe aussehen:
Maik Müller
Stefan Keller
Daniel Schmidt
Richard Schulze
Ralf Schubert Jemand eine Idee, wie das geht?
|
Vain
Anmeldungsdatum: 12. April 2008
Beiträge: 2503
|
Servus,
Jemand eine Idee, wie das geht?
einen Haufen. 😉 Am liebsten mag ich da sed mit Shell-Umleitungen, dem zugrunde liegen reguläre Ausdrücke:
| sed -r 's/(.*), (.*)/\2 \1/' <eingabedatei >ausgabedatei
|
Erklärung:
sed -r 's/(.*), (.*)/\2 \1/' <eingabedatei >ausgabedatei
│ ││└─┬─┘ └─┬┘││ │ │
│ ││ │ │ ││ │ └ Abschließender Trenner.
│ ││ │ │ ││ │
│ ││ │ │ ││ └ ... dann nach einem Leerzeichen die erste
│ ││ │ │ ││ Gruppe. Damit ist die Reihenfolge umgedreht
│ ││ │ │ ││ und das Komma entfernt.
│ ││ │ │ ││
│ ││ │ │ │└ Zweite Gruppe zuerst ...
│ ││ │ │ │
│ ││ │ │ └ Zweites Trennzeichen, ab jetzt kommt das
│ ││ │ │ Ersetzungsmuster.
│ ││ │ │
│ ││ │ └ Zweite Gruppe: Alles nach dem Komma und dem
│ ││ │ Leerzeichen dahinter.
│ ││ │
│ ││ └ Erste Gruppe: Alles vor dem Komma.
│ ││
│ │└ Trennzeichen, hiernach folgt das Suchmuster.
│ │
│ └ "s"-Befehl: Ersetze pro Zeile.
│
└ Damit runden Klammern kein Backslash vorangestellt werden muss
(unter anderem). HTH. ☺
|
E.C.
Anmeldungsdatum: 5. April 2010
Beiträge: 98
|
Also in Python ganz schnell zusammengebastelt würde ich das so schreiben: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | #!/usr/bin/python
Input_Name = 'Test.txt'
Output_Name = 'Test2.txt'
in_fi = open(Input_Name, 'r')
inhalt = in_fi.readlines()
in_fi.close()
ou_fi = open(Output_Name, 'w')
for eintrag in inhalt:
eintrag = eintrag.replace('\n', '')
if ',' in eintrag:
eintrag = eintrag.replace(' ', '')
eintrag = eintrag.split(',')
eintrag = '{0} {1}'.format(eintrag[1], eintrag[0])
ou_fi.write(eintrag + '\n')
ou_fi.close()
|
Gibt zwar sicherlich bessere Lösungen aber diese funktioniert auch. Einfach mit der Endung .py speichern (Input_Name und Output_Name mit den entsprechenden Dateinamen ersetzen) und per "python scriptname.py" starten.
|
Vain
Anmeldungsdatum: 12. April 2008
Beiträge: 2503
|
@E.C.: Wehe, wenn ein zweiter Vorname („Hans Otto“) angegeben ist. 😀
|
E.C.
Anmeldungsdatum: 5. April 2010
Beiträge: 98
|
Vain schrieb: @E.C.: Wehe, wenn ein zweiter Vorname („Hans Otto“) angegeben ist. 😀
Davon war nirgends die Rede. Könnte aber auch sagen: "Wehe, bei deinem Beispiel vertippt man sich und muss den Fehler suchen" 😀 😉
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
E.C. schrieb: Also in Python ganz schnell zusammengebastelt würde ich das so schreiben:
Das ganz schnell rettet Dich im Zweifel 😉 Hier mal keine Kritik:
http://paste.pocoo.org/show/355260/ So und hier mein Vorschlag:
http://paste.pocoo.org/show/355267/ Kann auch Mehrere Vornamen ☺
|
diesch
Anmeldungsdatum: 18. Februar 2009
Beiträge: 5072
Wohnort: Brandenburg an der Havel
|
Eine Variante mit awk:
| awk -F', ' '{print $2?$2" "$1:$1}' < eingabedate > ausgabedatei
|
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
Vain schrieb Erklärung:
sed -r 's/(.*), (.*)/\2 \1/' <eingabedatei >ausgabedatei
│ ││└─┬─┘ └─┬┘││ │ │
│ ││ │ │ ││ │ └ Abschließender Trenner.
│ ││ │ │ ││ │
│ ││ │ │ ││ └ ... dann nach einem Leerzeichen die erste
│ ││ │ │ ││ Gruppe. Damit ist die Reihenfolge umgedreht
Hast Du da eigentlich ein Programm für, oder ist das handgedengelt und mundgeblasen? ☺
|
mrkramps
Anmeldungsdatum: 10. Oktober 2006
Beiträge: 5523
Wohnort: south central EL
|
user unknown schrieb: Vain schrieb Erklärung:
sed -r 's/(.*), (.*)/\2 \1/' <eingabedatei >ausgabedatei
│ ││└─┬─┘ └─┬┘││ │ │
│ ││ │ │ ││ │ └ Abschließender Trenner.
│ ││ │ │ ││ │
│ ││ │ │ ││ └ ... dann nach einem Leerzeichen die erste
│ ││ │ │ ││ Gruppe. Damit ist die Reihenfolge umgedreht
Hast Du da eigentlich ein Programm für, oder ist das handgedengelt und mundgeblasen? ☺
Psst, mir hat Vain schon was verraten - sein eigenes, ultimatives explain 👍
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
dauerflucher schrieb: Psst, mir hat Vain schon was verraten - sein eigenes, ultimatives explain 👍
Nettes Scriptchen ☺ Enthält auf den ersten Blick zwar einige krude Code-Stellen, aber das werd ich mir mal definitiv genauer angucken. Danke für den Link!
|
Vain
Anmeldungsdatum: 12. April 2008
Beiträge: 2503
|
Lysander schrieb: Nettes Scriptchen ☺ Enthält auf den ersten Blick zwar einige krude Code-Stellen, aber das werd ich mir mal definitiv genauer angucken. Danke für den Link!
Patches sind immer willkommen! ☺
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
Oh, hier mein erstes Produkt, mit etwas Handarbeit: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | ttyid=$(readlink /proc/$$/fd/1)
\___/ \______/ \___/ | | |
| | | | | \- 0: stdin
| | | | | 1: stdout <- our interest
| | | | | 2: stderr
| | | | \- fd is, maybe, filedescriptor
| | | |
| | | \- $$ is the PID of the current process (shell,
| | | in our case)
| | |
| | \- you know, much runtime stuff is here
| |
| \- readlink extracts the symbolic link of /proc/$$/fd/1
| lrwx------ 1 stefan stefan 64 2011-03-18 09:11
| /proc/22159/fd/1 -> /dev/pts/4
|
\- /dev/ttyN for traditional shell, /dev/pts/N for xterm
|
Zum Glück kann ich keine p-Sprachen, dann muss ich meine guten Featurerequests nicht selbst umsetzen. Ich finde, wenn man 3 Zeilen ohne Leerzeile eingibt, sollten die auch so erscheinen. Ah - sollte ich die --help-Seite vielleicht erst lesen? werde ich machen. ☺
|