Zeile für Zeile an Textdatei anhängen

A

abenstex

Grünschnabel
Hallo zusammen,

ich weiss nicht, ob das was ich will so einfach zu bewerkstelligen ist oder nicht. Ich frag jetzt aber trotzdem mal:
Ich habe 23 Textdateien mit einer Größe von ca. 200MB pro Datei. Die Struktur der Datei ist ungefähr so:
ID Spalte1 Spalte2 Spalte3 ... Spalte40000
Jetzt möchte ich alle Dateien in einer Datei kombinieren, dazu muss ich immer jeweils eine Zeile der Datei X an das Ende der entsprechenden Zeile in der Datei Y anhängen. Allerdings müssen dann natürlich auch die IDs übereinstimmen. D.h. dass ich die Zeile aus der Datei X nur an die Zeile der Datei Y anhängen kann wenn die IDs in eben jener Zeile übereinstimmen. Alle Dateien beinhalten zwar die gleichen IDs und auch die gleiche Anzahl von IDs allerdings nicht zwangsläufig in derselben Reihenfolge.

Also, ich bin über jeden Vorschlag froh!
Danke
Chris
 
Verstehe ich das richtig:
Datei 1
1 lalala
2 lalala
5 lalala
3 lalala
4 lalala

Datei 2
2 lululu
3 lululu
5 lululu
1 lululu
4 lululu

Und dann soll so etwas rauskommen:
1 lalala 1 lululu
2 lalala 2 lululu
5 lalala 3 lululu
3 lalala 4 lululu
4 lalala 5 lululu

Auf Shell-Ebene stell ich mir das schwierig vor.
Perl käme eventuell in Frage, allerdings bei mehreren hundert Megabyte kostet das einiges an Performance!

Wenn möglich solltest du stattdessen mit sortierten Dateien arbeiten, dann können die Dateien Zeile für Zeile abgearbeitet werden.

Erstmal ein 'sort' auf alle Dateien und dann mit einer verschachtelten Schleife durch die Dateien gehen und die Zeilen aneinander hängen. Dazu gibt es 'join'.
Kurzes Beispiel:
Code:
for FILE in <Dateiliste> ; do
  sort $FILE > $FILE.sorted
done
for FILE in <sortierte-Dateiliste-ohne-erste-Datei> ; do
  join <erste-sortierte-Datei> $FILE
done
Eine Lektüre von 'man join' oder zumindest 'join --help' ist sinnvoll!

Viel Erfolg!
XL
 
ich glaube cut kann sowas auch. Ansonsten, ist das ein kleines C/C++ Prog.
 
Verstehe ich das richtig:
Datei 1
1 lalala
2 lalala
5 lalala
3 lalala
4 lalala

Datei 2
2 lululu
3 lululu
5 lululu
1 lululu
4 lululu

Und dann soll so etwas rauskommen:
1 lalala 1 lululu
2 lalala 2 lululu
5 lalala 3 lululu
3 lalala 4 lululu
4 lalala 5 lululu

Auf Shell-Ebene stell ich mir das schwierig vor.
Perl käme eventuell in Frage, allerdings bei mehreren hundert Megabyte kostet das einiges an Performance!

Wenn möglich solltest du stattdessen mit sortierten Dateien arbeiten, dann können die Dateien Zeile für Zeile abgearbeitet werden.

Erstmal ein 'sort' auf alle Dateien und dann mit einer verschachtelten Schleife durch die Dateien gehen und die Zeilen aneinander hängen. Dazu gibt es 'join'.
Kurzes Beispiel:
Code:
for FILE in <Dateiliste> ; do
  sort $FILE > $FILE.sorted
done
for FILE in <sortierte-Dateiliste-ohne-erste-Datei> ; do
  join <erste-sortierte-Datei> $FILE
done
Eine Lektüre von 'man join' oder zumindest 'join --help' ist sinnvoll!

Viel Erfolg!
XL

Eigentlich sollte nur lulu ans 1 lala angehängt werden, sprich die IDs nicht doppelt anhängen. Werd mir aber auf jeden Fall mal join anschauen. Geht da vielleicht was mit awk? Kenn mich allerdings mit awk überhaupt nicht aus.
 
Eigentlich sollte nur lulu ans 1 lala angehängt werden, sprich die IDs nicht doppelt anhängen. Werd mir aber auf jeden Fall mal join anschauen. Geht da vielleicht was mit awk? Kenn mich allerdings mit awk überhaupt nicht aus.

'join' kann auch Felder eliminieren, das ist also kein Problem. Ansonsten gibt es noch 'cut'. Wäre dann eben eine pipe dazu. Aber das ist wirklich das geringste Problem bei deinen Monsterdateien :rolleyes:

AWK kann so etwas sicher auch, allerdings wäre das m.E. nur dann eine Option, wenn die Dateien unsortiert bleiben sollen.
Falls die Reihenfolge wichtig sein sollte, könnte man auch ein Konstrukt der folgenden Art ersinnen:
  • nummeriere die Zeilen durch
  • sortiere nach der ID
  • füge zusammen
  • sortiere nach der anfangs eingefügten Nummer und entferne diese
:devil:

Mir ist noch ein Fehler meines ersten Postings aufgefallen:
Im Beispiel der aneinandergehängten Zeilen müssen die IDs natürlich korrekt übereinstimmen.
Da habe ich wohl etwas schludrig zusammenkopiert. :(
 

Ähnliche Themen

Server-Monitoring mit RRDTool

Zurück
Oben