Shell-Skript: Pro Zeile einen Befehl ausführen
Hallo. Habe gerade ein Problem mit einem Shellskript. Und zwar soll aus mehreren Dateien der Text ausgelesen und in einer Datei gespeichert werden. So weit ist das ja einfach. Allerdings soll _vor_ jeder Zeile der Name der Ursprünglichen Datei eingefügt werden. Und es dürfen auch nur maximal die ersten 15 Zeilen übernommen werden. Aber auch wenn eine Datei weniger Zeilen hat, sollen 15 Zeilen dieser Datei in der "Sammeldatei" erscheinen. Bisher sieht mein Skript so aus (die Umleitung in eine Datei hab ich für Testzwecke weggelassen): [...] for LINE in ${INHALT} ; do echo "${DATEI}: ${LINE}" done LINES=`wc -l "${DATEI}"` MLINES=`expr 15 - ${LINES}` while [ ${MLINES} -gt 0 ] ; do echo "${DATEI}: " MLINES=`expr ${MLINES} - 1` done [...] Die for-Schleife funktioniert natürlich nicht! Die macht mir nämlich die Probleme. Und ich weiß auch nicht, wie ich am besten die Zeilen auf 15 beschränke. Das nachträglich Einfügen mit der while-Schleife macht keine Probleme. Nur wie setze ich jetzt "${DATEI}: " vor jede Zeile und schneide bei schneide den Rest bei 15 Zeile ab? Leider fällt mir die ganze Zeit weder Lösungsweg noch ein Programm, oder Befehl ein, mit dem ich das lösen könnte. Hättet ihr vielleicht das eine oder andere Stichwort für mich? Gruß Marcus
Am Donnerstag, 16. September 2004 22:17 schrieb Marcus Habermehl:
So weit ist das ja einfach. Allerdings soll _vor_ jeder Zeile der Name der Ursprünglichen Datei eingefügt werden. Und es dürfen auch nur maximal die ersten 15 Zeilen übernommen werden.
Aber auch wenn eine Datei weniger Zeilen hat, sollen 15 Zeilen dieser Datei in der "Sammeldatei" erscheinen.
Hättet ihr vielleicht das eine oder andere Stichwort für mich?
man head Dann halt noch prüfen, ob mittels "echo" oder so noch Zeilen ergänzt werden müssen. Matthias
Am Donnerstag, 16. September 2004 22:17 schrieb Marcus Habermehl:
Habe gerade ein Problem mit einem Shellskript.
Und zwar soll aus mehreren Dateien der Text ausgelesen und in einer Datei gespeichert werden.
So weit ist das ja einfach. Allerdings soll _vor_ jeder Zeile der Name der Ursprünglichen Datei eingefügt werden. Und es dürfen auch nur maximal die ersten 15 Zeilen übernommen werden.
Aber auch wenn eine Datei weniger Zeilen hat, sollen 15 Zeilen dieser Datei in der "Sammeldatei" erscheinen.
for i in *; do head -n 15 $i | while read l; do echo "$i: $l" >>file.out done done Jan -- Linux-Quickies: http://www.jan-trippler.de PingoS: http://www.pingos.org
Am Donnerstag 16 September 2004 22:57 schrieb Jan Trippler:
Am Donnerstag, 16. September 2004 22:17 schrieb Marcus Habermehl:
Habe gerade ein Problem mit einem Shellskript.
Und zwar soll aus mehreren Dateien der Text ausgelesen und in einer Datei gespeichert werden.
So weit ist das ja einfach. Allerdings soll _vor_ jeder Zeile der Name der Ursprünglichen Datei eingefügt werden. Und es dürfen auch nur maximal die ersten 15 Zeilen übernommen werden.
Aber auch wenn eine Datei weniger Zeilen hat, sollen 15 Zeilen dieser Datei in der "Sammeldatei" erscheinen.
for i in *; do n=0 head -n 15 $i | while read l; do echo "$i: $l" >>file.out $n=$n+1 done while [ $n -lt 15 ]; do echo "$i: " >>file.out $n=$[$n+1] done done
Hab mal ergänzt für die evtl. notwendigen Füllzeilen. ;-) -- Gruß MaxX Hinweis 1: PMs an diese Adresse werden automatisch vernichtet. Hinweis 2: Bitte unbedingt beachten: http://www.suse-etikette.de.vu
Hallo Jan, hallo Marcus, hallo Leute, Am Donnerstag, 16. September 2004 22:57 schrieb Jan Trippler:
Am Donnerstag, 16. September 2004 22:17 schrieb Marcus Habermehl: [...] for i in *; do head -n 15 $i | while read l; do ^^ BTW: Quoting nicht vergessen ;-)
echo "$i: $l" >>file.out done done
for i in * ; do sed -n "1,15 s¿^¿$i: ¿p" < "$i" done geht vermutlich schneller. Statt head wird sed aufgerufen (dürfte keinen großen Unterschied machen) und man spart sich das zeilenweise Einlesen in der Bash-Schleife. Ach so: falls wider Erwarten in Deinen Dateinamen ein ¿ vorkommt, solltest Du das im sed-Befehl durch ein anderes Zeichen ersetzen, das in keinem Deiner Dateinamen vorkommt. Gruß Christian Boltz --
So... Hm... ich bin etwas aufgeschmissen. How to troubleshoot without trouble? Schwierige Frage, aber eine gute sig ;-) Umgekehrt wär mir lieber. :-) [> Christian Boltz und Ratti in fontlinge-devel]
Hallo. Am Donnerstag, den 16.09.2004, 22:57 +0200 schrieb Jan Trippler:
Am Donnerstag, 16. September 2004 22:17 schrieb Marcus Habermehl:
Habe gerade ein Problem mit einem Shellskript.
Und zwar soll aus mehreren Dateien der Text ausgelesen und in einer Datei gespeichert werden.
So weit ist das ja einfach. Allerdings soll _vor_ jeder Zeile der Name der Ursprünglichen Datei eingefügt werden. Und es dürfen auch nur maximal die ersten 15 Zeilen übernommen werden.
[...]
for i in *; do head -n 15 $i | while read l; do echo "$i: $l" >>file.out done done
Danke, head war genau das, was mir nicht in den Sinn gekommen ist. Gruß Marcus
participants (5)
-
Christian Boltz
-
Jan.Trippler@t-online.de
-
Marcus Habermehl
-
Matthias Houdek
-
Matthias Juchem