Simples GAWK-Bashskript

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
cgnuser
Beiträge: 2
Registriert: 13.10.2021 16:36:56

Simples GAWK-Bashskript

Beitrag von cgnuser » 13.10.2021 16:43:26

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

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Simples GAWK-Bashskript

Beitrag von JTH » 13.10.2021 17:02:51

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:

Code: Alles auswählen

kommando | while read var; do
    # mach was mit $var
done
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:

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.

cgnuser
Beiträge: 2
Registriert: 13.10.2021 16:36:56

Re: Simples GAWK-Bashskript

Beitrag von cgnuser » 13.10.2021 19:39:59

Lieben Dank für die Infos und die Links!

Gruss
cgnuser

Benutzeravatar
Meillo
Moderator
Beiträge: 8817
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Simples GAWK-Bashskript

Beitrag von Meillo » 13.10.2021 20:25:26

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!

Antworten