Bash: Mehrere Dateien nach bestimmtem Schema verbinden

Bash, Shell, PHP, Python, Perl, CGI
web-gear
Posts: 59
Joined: 2003-03-15 00:25

Bash: Mehrere Dateien nach bestimmtem Schema verbinden

Post by web-gear » 2005-01-07 00:22

Hallo zusammen,

ich - noch recht unerfahren in Sachen Shell Programmierung - habe leider auch nach Studium der für Einsteiger empfohlenen Links (vielen Dank!) mein Wunsch-Bash-Skript nicht zu 100% erstellen können.

Ich habe eine Liste von Dateien
datei_1.txt
datei_10.txt
datei_200.txt
Diese Dateien möchte ich zu einer neuen Datei, die - sollte sie schon existieren einfach überschreiben werden soll - die Inhalte der einzelnen Dateien enthalten sollen, zusammen mit einem Vermerk aus welcher urspünglichen Datei die entsprechende Zeile stammt.
Alternativ würde es auch gehen, wenn einfach der Beginn einer neuen Urspungsdatei speziell gekennzeichnet wird, und zwar durch deren Nummer, also bei "datei_200.txt" wäre das dann "200".

Mein Script sieht bisher so aus:
#!/bin/bash

for FILE in /pfad/zu/datei_*.txt
do
echo "#$FILE"
cat $FILE
echo
done
Ist vermutlich ziemlich schlecht gemacht aber es funktioniert, nur leider gibt es nicht die Nummer aus sondern den ganzen Dateinamen der Urspungsdatei:
#/pfad/zu/datei_1.txt
zeile1 aus datei_1.txt
zeile2 aus datei_1.txt
zeile3 aus datei_1.txt
#/pfad/zu/datei_10.txt
zeile1 aus datei_10.txt
zeile2 aus datei_10.txt
zeile3 aus datei_10.txt
#/pfad/zu/datei_200.txt
zeile1 aus datei_200.txt
zeile2 aus datei_200.txt
zeile3 aus datei_200.txt
Damit ich das Script aber einsetzen kann bräuchte ich entweder etwas in der Form
#1
zeile1 aus datei_1.txt
zeile2 aus datei_1.txt
zeile3 aus datei_1.txt
#10
zeile1 aus datei_10.txt
zeile2 aus datei_10.txt
zeile3 aus datei_10.txt
#200
zeile1 aus datei_200.txt
zeile2 aus datei_200.txt
zeile3 aus datei_200.txt
oder aber auch, wie oben beschreiben, so etwas:
zeile1 aus datei_1.txt,1
zeile2 aus datei_1.txt,1
zeile3 aus datei_1.txt,1
zeile1 aus datei_10.txt,10
zeile2 aus datei_10.txt,10
zeile3 aus datei_10.txt,10
zeile1 aus datei_200.txt,200
zeile2 aus datei_200.txt,200
zeile3 aus datei_200.txt,200

Leider habe ich keinen Befehl/keine Technik gefunden, mit der ich das so bewerkstelligen kann. Eigentlich fehlt bloß eine Variable, die mir den Inhalt des "Sternchens" zurückgibt. Leider habe ich so etwas in den Manuals nicht gefunden.

Kann mir hier evtl. jemand weiterhelfen?

Vielen Dank schon im Voraus!

MfG
Hermann

oxygen
RSAC
Posts: 2179
Joined: 2002-12-15 00:10
Location: Bergheim

Re: Bash: Mehrere Dateien nach bestimmtem Schema verbinden

Post by oxygen » 2005-01-07 01:16

sed awk und cut könnten dir weiterhelfen.

web-gear
Posts: 59
Joined: 2003-03-15 00:25

Re: Bash: Mehrere Dateien nach bestimmtem Schema verbinden

Post by web-gear » 2005-01-07 02:16

øxygen wrote:sed awk und cut könnten dir weiterhelfen.
Vielen Dank für Deine Antwort.

Ja ich habe in einem der Links von diesen Tools gelesen. Leider verstehe ich nicht ganz, wie ich z.B. cut einsetzen soll, da es ja laut Manual auf die Inhalte von Dateien anspringt. Ich vermute, ich kann mit dem "<" auch irgendwie Inhalte übergeben, aber wie das funktionieren soll, verstehe ich nicht. Schließlich geht es bei mir um einen vorhandenen String, nicht um Daten aus einer Datei. Habe auch schon rumprobiert, leider ohne Erfolg.
Auch in sed ist immer nur von Dateien und Zeilen die Rede.

awk scheint sdo mächtig zu sein, dass es für meinen simplen Fall keinerlei Beispiele gibt, die mich weiterbringen. Zumindest habe ich keines gefunden, nur jede Menge relativ "abgefahrene" Sachen die man damit machen kann.

Ich will doch nur einfach die Nummer aus dem Dateinnamen extrahieren :cry: Kann mir jemand ein einfaches Beispiel geben?

Vielen Dank!!

MfG
Hermann

kuntho
Posts: 149
Joined: 2004-10-27 14:22
Location: Küps

Re: Bash: Mehrere Dateien nach bestimmtem Schema verbinden

Post by kuntho » 2005-01-07 08:05

Alt:

Code: Select all

#!/bin/bash 

for FILE in /pfad/zu/datei_*.txt 
do 
echo "#$FILE" 
cat $FILE 
echo 
done 
Neu:

Code: Select all

#!/bin/bash 

for FILE in /pfad/zu/datei_*.txt 
do 
echo #${FILE} | sed "s/datei_/ /g" | awk '{print $2}' 
cat ${FILE} 
echo 
done 

web-gear
Posts: 59
Joined: 2003-03-15 00:25

Re: Bash: Mehrere Dateien nach bestimmtem Schema verbinden

Post by web-gear » 2005-01-07 15:42

Hallo,

VIELEN DANK! DAs war genau der Tipp den ich brauchte.

Es hat so nicht ganz funktioniert, aber in dieser Form läuft es jetzt tadellos:

Code: Select all

#!/bin/bash

for FILE in /pfad/zu/datei_*.txt
do
echo -n "#"
echo ${FILE} | sed "s/datei_/ /g" | sed "s/.txt/ /g" | awk '{print $2}'
cat ${FILE}
echo
done
Danke nochmal!

MfG
Hermann

kuntho
Posts: 149
Joined: 2004-10-27 14:22
Location: Küps

Re: Bash: Mehrere Dateien nach bestimmtem Schema verbinden

Post by kuntho » 2005-01-07 15:48

ok, das mit der Extension hatte ich übersehen, sorry. in diesem Fall könnte man (der Eleganz wegen) folgendes machen:

echo ${FILE} | sed "s/datei_/ /g" | sed "s/.txt//g" | awk '{print $2}'

(das ".txt" kann einfach verschwinden, muss man in diesem Fall nciht durch ein Leerzeichen ersetzen)

mfg

KunTho

captaincrunch
Userprojekt
Userprojekt
Posts: 7225
Joined: 2002-10-09 14:30
Location: Dorsten

Re: Bash: Mehrere Dateien nach bestimmtem Schema verbinden

Post by captaincrunch » 2005-01-07 15:50

Noch eleganter:

Code: Select all

echo ${FILE} | sed -e s/datei_/ /g -e s/.txt//g | awk '{print $2}' 
;)
DebianHowTo
echo "[q]sa[ln0=aln256%Pln256/snlbx]sb729901041524823122snlbxq"|dc

kase
RSAC
Posts: 1041
Joined: 2002-10-14 22:56

Re: Bash: Mehrere Dateien nach bestimmtem Schema verbinden

Post by kase » 2005-01-07 16:34

Noch eleganter wäre es mit basename, oder? ;)

flo
RSAC
Posts: 2297
Joined: 2002-07-28 13:02
Location: Berlin

Re: Bash: Mehrere Dateien nach bestimmtem Schema verbinden

Post by flo » 2005-01-07 18:53

Dann kann man aber mit

Code: Select all

-F
auch gleich den Spaltentrenner für awk ändern ... ;-)

Code: Select all

for i in ls -l *m3u; do basename $i .m3u | awk -F - '{print $2}'; done
funzt bei mir ...

flo.