ubuntuusers.de

logische Zusammenfügen von 2 Dateien

Status: Gelöst | Ubuntu-Version: Kubuntu 12.04 (Precise Pangolin)
Antworten |

torsten23

Anmeldungsdatum:
18. November 2008

Beiträge: 147

Hallo,

ich habe zwei Textdateien welchen ich zusammenfügen "spaltenweise" möchte.

Datei1 sieht wie folgt aus:

1
2
3
MaxMusterPerson3
Tobi Testperson
NachnamePerson3

Datei 2

1
2
3
Tobi Testperson  7 38
MaxMusterPerson3 5 12
NachnamePerson3 43 23

rausbekommern möchte ich nun

1
2
3
MaxMusterPerson3 5 12
Tobi Testperson 7 38
NachnamePerson3 43 23

Wie könnte ich das nun am besten erreichen ohne "manuell" sortieren zu müssen... Beide Dateien zu sortieren und dann paste, join ist leider nicht möglich, weil sich die Reihenfolge von Datei1 nicht ändern darf.

Gibt es da einen einfachen Befehl, Option die ich vielleicht übersehen habe, oder müsste man dies aufwendig mit sed/awk oder shell-skript sich selber zusammenbasteln?

Vielen Dank

Torsten

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Wohnort: Göttingen

Hi, angenommen, die erste datei, mit der richtigen Sortierung heisst test1.txt, die zweite mit den weiteren Angaben heisst test2.txt. Dann kannst Du das durch folgenden Befehel richtig zusammenführen:

cat test1.txt| while read line; do grep "$line" test2.txt >> test3.txt; done

Das Ergebnis steht dann in der datei test3.txt

Ist vielleicht nicht die optimalste Lösung, aber die Dateien werden hoffentlich auch nicht allzu groß sein...

torsten23

(Themenstarter)

Anmeldungsdatum:
18. November 2008

Beiträge: 147

Hallo,

vielen Dank, das funktioniert genau so wie ich es wollte.

Torsten

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7791

Die Grep-Lösung ist ein guter Ansatz, produziert aber jedenfalls Fehler wenn einer den gleichen Namensteil hat wie ein anderer, also z.B. "Max Muster" und "Max Mustermann". Die "Max Muster" Zeile würde dann sowohl auf "Max Muster" und "Max Mustermann" anschlagen, man hätte dann am Ende also was doppelt.

Vielleicht ist es sicherer noch ^ (Zeilenanfang) und " " (Leerzeichen nach dem Namen) im Grep zu verlangen, also "^$line " statt nur "$line". Getestet habe ich dies jetzt aber nicht.

Streng genommen müßte man auch prüfen ob Grep überhaupt was findet und einen etwaigen Fehlerfall entsprechend behandeln. Aber wenn du das Ergebnis von Hand validieren/prüfen kannst/willst geht es wohl auch so. Die Lösung deckt eben nicht alle denkbaren Fälle ab.

torsten23

(Themenstarter)

Anmeldungsdatum:
18. November 2008

Beiträge: 147

ok, ja das sollte ich im Hinterkopf behalten... aktuelle denke ich dass bei meinen Daten dies nicht auftreten sollte.... bzw. verhältnismässig einfach überprüft werden kann...

Aber vielen Dank für den Hinweis

Torsten

Hefeweiz3n Team-Icon

Moderator, Webteam
Avatar von Hefeweiz3n

Anmeldungsdatum:
15. Juli 2006

Beiträge: 5816

Wohnort: Ankh-Morpork

Zur Erleichterung der Arbeit der Supporter und zur besseren Übersicht im Forum bitten wir die Benutzer darum, gelöste Threads auch als "gelöst" zu markieren. Schau bitte kurz in diesen Ikhaya Beitrag oder Forum bedienen, dort ist auch beschrieben wie das geht.

Ich habe das mal für dich nachgeholt. ☺ Danke

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Sind die Namen in Datei2 denn unique? Wenn ja, wäre der Ansatz mit grep ineffizient und man könnte die Komplexität auf O(2n) drosseln, statt O(n*m). Ok, das mag nur bei sehr langen Dateien ein Problem sein, aber erwähnen kann man es ja trotzdem mal ☺

Edit: So, hier mal der Ansatz in Python

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Wohnort: Göttingen

Da hat Frostschutz etwas Gutes angesprochen.

Antworten |