ubuntuusers.de

[bash] Mehrere TextDateien zu einer zusammenfügen

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

dersven

Anmeldungsdatum:
16. August 2005

Beiträge: 792

Wohnort: Kreuzlingen, Schweiz

Hallo.

Ich möchte mehrere Text-Dateien zu einer Text-Datei zusammenfügen. Normal würde ich das mit dem Befehl cat machen. Allerdings möchte ich alles bis auf die erste Zeile aus jeder Datei haben.

In diesem Fall weiss ich, dass meine Datei genau 125 Zeile hat. Also habe ich gedacht, ich könne mehrere Dateien an tail übergeben, allerdings wird dann auch der Dateiname jeder Datei mit in die Ausgabe geschrieben. Also wollte ich eine Schleife machen:

1
2
3
4
5
6
7
#!/bin/bash                                                                                                                                                         
((number=0))

while((number=number+1));((number<1000))
do
   echo $(tail -n124 run${number}.data)
done

Ungeschickterweise werden jetzt die Zeilen jeder Datei ein eine einzige Zeile (durch leerzeichen getrennt) zusamengefügt.

Ich dachte mir, ich könne jetzt mit sed die Leerzeichen wieder durch Zeilenumbrüche ersetzen, aber sed kann scheinbar keinen Standard-Input lesen,... Davon abgesehen kann ich mir nicht vorstllen, dass es nur auf diesn sehr umständlichen weg geht, den ich gewählt habe.

Kann mir jemand helfen?

Grüße und Danke

The-Compiler Team-Icon

Avatar von The-Compiler

Anmeldungsdatum:
21. April 2006

Beiträge: 2640

Wohnort: Winterthur, Schweiz

Sali,

sed kann standard input lesen, und sed kann noch viel mehr 😉

florian@Snape ~/foo % echo -e 'eins\nzwei\ndrei' > 1
florian@Snape ~/foo % echo -e 'vier\nfünf\nsechs' > 2
florian@Snape ~/foo % cat 1
eins
zwei
drei
florian@Snape ~/foo % cat 2
vier
fünf
sechs
florian@Snape ~/foo % sed -s '1d' 1 2
zwei
drei
fünf
sechs
florian@Snape ~/foo % 

1d ist der sed-Befehl, um die erste Zeile zu löschen. -s sagt sed, es soll die zwei Dateien als zwei einzelne Dateien behandeln, und nicht erst zusammenfügen und dann bearbeiten 😉

En schöne,

Flo

Keba Team-Icon

Ehemalige
Avatar von Keba

Anmeldungsdatum:
24. Juli 2007

Beiträge: 3802

Morgen zusammen

sed kann scheinbar keinen Standard-Input lesen

Das ist zwar nicht das Hauptproblem, aber da das vermutlich schnell gelöst ist (The Compilers Version sieht imho nett aus), gehe ich mal drauf ein:

$ echo 'geht nicht' > removeme.txt
$ sed 's/nicht/doch/' < removeme.txt
geht doch
$ rm removeme.txt 

sed kann also ohne Probleme vom Standardinput lesen ☺

Grüße, Keba.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

tail -n +2 

liefert alle Zeilen beginnend ab der zweiten.

Mit -q unterdrückt man die Ausgabe von Dateinamensheadern, wenn man viele Dateien verarztet:

for c in {a..c}; do for n in {1..3} ; do echo -e $c$n ; done > $c.dat ; done
cat ?.dat 
a1
a2
a3
b1
b2
b3
c1
c2
c3
tail -q -n +2 *.dat > merge.dat
cat merge.dat 
a2
a3
b2
b3
c2
c3

Wie bei der sed-Lösung kommt man ohne Schleife aus.

Statt Deiner while-Schleife bietet sich aber in Fällen, in denen man unbedingt eine braucht, die for-Schleife an:

for ((number = 0; number < 7; ++number))
do
   echo $(tail -n +2 run${number}.data)
done
Antworten |