Dateien zusammenführen

E

este

Hallo,

ich habe ca. 8000 1-10 MB grosse Text-Dateien (1.dat...2.dat...n.dat).
Diese möchte ich nun der Reihe nach Aufsteigend in eine Datei zusammenführen.
Nun wäre es schön, ohne die Anzahl der Dateien zu kennen, diese automatisch zusammenführen zu lassen.

Gut wäre zum Beispiel, wenn ich n.dat wüßte. Also die Datei mit der höchsten Numerierung um dann ein Abbruchkriterium für eine Schleife zu haben.

Zusammenführen würde ich dann mit cat wobei ich mir die Parameter
dann in einer Schleife zusammenbauen würde.

Das sollte dann folgendermassen aussehen:
cat 1.dat 2.dat n.dat > merged.dat

Hat jemand eine Idee?

gruss
este
 
Wieviele Dateien es sind, kannst du mit
Code:
ls /verzeichnis/der/dateien/ | wc -l
ermitteln.
 
Naja, wenn die Reihenfolge dann stimmt ....
Dateien werden in diesem Fall unsortiert ausgegeben, also in der Reihenfolge, wie sie auf der Platte kommen (stimmt das soweit??).
Aber es wurde explizit nach einer Sortierung anhand des Dateinamens gefragt. Dann sollte dies auch sichergestellt werden.

Gruß
XL
 
Also ich würds so machen, vorausgesetzt, du hast perl installiert:

Code:
perl -we 'map { `cat $_.dat >> merged.dat` } sort { $a <=> $b } grep { s/(\d)\.dat/$1/ } split "\n", `ls`';

Es ist quick&dirty und nur mit 4 Dateien getestet, aber vielleicht hilfts ja :)
Gebe jedenfalls keine Garantie.

/edit: Korrigiert. Hatte nicht ganz gefunzt ;)
 
Zuletzt bearbeitet:
Naja, wenn die Reihenfolge dann stimmt ....
Dateien werden in diesem Fall unsortiert ausgegeben, also in der Reihenfolge, wie sie auf der Platte kommen (stimmt das soweit??).
Aber es wurde explizit nach einer Sortierung anhand des Dateinamens gefragt. Dann sollte dies auch sichergestellt werden.

Gruß
XL

Das mit dem Sortiern hab ich überlesen, sorry. Aber wenn es Numerisch ist, wie oben angegeben (1.dat, 2.dat, n.dat) dann könnte er es richtig machen wenn es mit 0 aufgefüllt ist, alsoe 00001.dat, ... . eine kleine for-schleife mit mv usw. dann wäre es mit 0 aufgefüllt.
 
Wie wäre es mit
Code:
sort -g * | cat >> merged.dat
Dadurch wird das Problem der Sortierung umgangen
 
Das mit dem Sortiern hab ich überlesen, sorry. Aber wenn es Numerisch ist, wie oben angegeben (1.dat, 2.dat, n.dat) dann könnte er es richtig machen wenn es mit 0 aufgefüllt ist, alsoe 00001.dat, ... . eine kleine for-schleife mit mv usw. dann wäre es mit 0 aufgefüllt.
:D Klar ginge das, aber damit wäre das Problem nur eine Stufe vorgezogen.
Für die genannte Schleife müßtest du ja auch die Dateien in der korrekten Reihenfolge lesen um sie dann umzubenennen.
Dann kannst du sie auch gleich cat-ten. :)
 
Wie wäre es mit
Code:
sort -g * | cat >> merged.dat
Dadurch wird das Problem der Sortierung umgangen

Nicht ganz, da er nach Inhalt der Dateien sortiert, nicht nach dem Namen.

Ich habe mein Perl-Beispielt oben angepasst, das war auch nicht ganz sauber. ;) Sollte jetzt aber funktionieren.
 
Nicht ganz, da er nach Inhalt der Dateien sortiert, nicht nach dem Namen.
Stimmt X(
War wohl doch schon etwas zu spät gestern ;(

Aber es geht trotzdem auch mit reinem Shellskript ohne Perl
Code:
for file in $(ls|sort -g) ; do cat $file >> merged.dat ; done

Grüße, Klaus
 
Zuletzt bearbeitet:

Ähnliche Themen

Telefoninterview (Wie sich auf Bash-Shell-Fragen vorbereiten?)

Dateien mit gleicher Größe löschen

Festplattenrettung mit ddrescue

awk: Dateiinhalt/Variableninhalt als Teil einer if-Anweisung

Mehrere Dateien umwandel?

Zurück
Oben