Hallo,
ich habe eine Textdatei, die mehrere Sätze enthält:
Dies ist ein Test.
Das war es jetzt.
...
Nun möchte ich jede 5. Zeile herauspicken und in eine Variable packen:
#!/bin/bash
for i in `gawk 'NR%5==0' test.txt`
do
echo $i
done
Leider tut das ganze nicht wie geplant. Das GAWK liefert brav die Zeilen aus, aber in der Variablen i landen die ganzen einzelnen Wörter und nicht der komplette Satz?!? Ich habe bereits mit echo und anderen Optionen dazu experimentiert, ohne Erfolg.
Das kann doch nicht so schwer sein, zumal, wenn es aus GAWK erst einmal richtig rauskommt...
Was mache ich falsch?
Danke,
cgnuser
Simples GAWK-Bashskript
Re: Simples GAWK-Bashskript
Moin und willkommen im Forum.
Das, was du vorhast, funktioniert so nicht (ohne weiteres) mit einer for-Schleife. Auf die Ausgabe der Subshell `gawk 'NR%5==0' test.txt` wird sogenanntes Word-Splitting angewendet [1][2]. Die Ausgabe wird dadurch, wie du bemerkt hast, hier tatsächlich in seine einzelnen Worte aufgeteilt und nicht zeilenweise abgearbeitet.
Ein üblicher Lösungsweg für deine Aufgabe ist mit Hilfe von read und einer while-Schleife:
siehe [3][4].
Das hat allerdings eine gewisse andere Einschränkung: Variablenwerte, die du innerhalb der Schleife zuweist, sind nicht außerhalb verfügbar. Falls das notwendig ist, kann man das noch etwas anders gestalten:
[1] https://www.gnu.org/software/bash/manua ... tting.html
[2] https://mywiki.wooledge.org/WordSplitting
[3] https://mywiki.wooledge.org/DontReadLinesWithFor
[4] https://mywiki.wooledge.org/BashFAQ/001
Das, was du vorhast, funktioniert so nicht (ohne weiteres) mit einer for-Schleife. Auf die Ausgabe der Subshell `gawk 'NR%5==0' test.txt` wird sogenanntes Word-Splitting angewendet [1][2]. Die Ausgabe wird dadurch, wie du bemerkt hast, hier tatsächlich in seine einzelnen Worte aufgeteilt und nicht zeilenweise abgearbeitet.
Ein üblicher Lösungsweg für deine Aufgabe ist mit Hilfe von read und einer while-Schleife:
Code: Alles auswählen
kommando | while read var; do
# mach was mit $var
done
Das hat allerdings eine gewisse andere Einschränkung: Variablenwerte, die du innerhalb der Schleife zuweist, sind nicht außerhalb verfügbar. Falls das notwendig ist, kann man das noch etwas anders gestalten:
Code: Alles auswählen
while read var; do
# mach was mit $var
done < <(kommando)
[1] https://www.gnu.org/software/bash/manua ... tting.html
[2] https://mywiki.wooledge.org/WordSplitting
[3] https://mywiki.wooledge.org/DontReadLinesWithFor
[4] https://mywiki.wooledge.org/BashFAQ/001
Manchmal bekannt als Just (another) Terminal Hacker.
Re: Simples GAWK-Bashskript
Lieben Dank für die Infos und die Links!
Gruss
cgnuser
Gruss
cgnuser
Re: Simples GAWK-Bashskript
Oder du setzt IFS passend, dann kannst du auch ganze Zeilen in der Schleife iterieren:
Code: Alles auswählen
#!/bin/bash
OIFS="$IFS"
IFS=$'\n'
for i in `gawk 'NR%5==0' test.txt`
do
echo "$i"
done
IFS="$OIFS"
Use ed once in a while!