Bash-Script: Zeilenweise aus komprimierter Datei lesen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
rannseier
Beiträge: 79
Registriert: 24.09.2007 12:37:30

Bash-Script: Zeilenweise aus komprimierter Datei lesen

Beitrag von rannseier » 14.04.2023 10:13:40

Hallo zusammen,

Ich muss aus zahlreichen Dateien Inhalte auslesen.

Geht ja z.B. so:

FILE=$1

COUNT=0
while read LINE
do
COUNT=`expr $COUNT + 1`

if $LINE
done <$FILE
echo $COUNT


Wichtig ist dabei, dass ich ausserhalb der Schleife an die Variablen komme.

Was mache ich, wenn die Datei komprimiert ist? An der Console kann ich die Datei mit zcat xyz auslesen. Wie mache ich im Script? Die Datei immer wieder neu zu de- und neukomprimieren möchte ich unbedingt verhindern.

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: Bash-Script: Zeilenweise aus komprimierter Datei lesen

Beitrag von MSfree » 14.04.2023 10:19:31

Zeilen kann man mit dem Befehl wc zählen.

Code: Alles auswählen

wc -l ascii.txt
Gibt die Anzahl der Zeilen in der Datei ascii.txt aus

Code: Alles auswählen

zcat ascii.txt.gz | wc -l
würde die Zahl der Zeilen in der mit gzip komprimierten Fassung der Datei ascii.txt ausgeben.

tobo
Beiträge: 2346
Registriert: 10.12.2008 10:51:41

Re: Bash-Script: Zeilenweise aus komprimierter Datei lesen

Beitrag von tobo » 14.04.2023 11:02:19

rannseier hat geschrieben: ↑ zum Beitrag ↑
14.04.2023 10:13:40
Wichtig ist dabei, dass ich ausserhalb der Schleife an die Variablen komme.
Kein Problem, da eine Schleife (anders als z.B. eine Pipe) keine Subshell aufmacht.

Vielleicht beschreibst du besser mal dein Problem, da möglicherweise noch weiteres (wc; MSfree) Verbesserungspotenzial besteht.

rannseier
Beiträge: 79
Registriert: 24.09.2007 12:37:30

Re: Bash-Script: Zeilenweise aus komprimierter Datei lesen

Beitrag von rannseier » 14.04.2023 11:17:56

Ich habe Dateien mit 100-200.000 Einträgen, die ich Zeilenweise zerlegen muss. Die Zeilen müssen auf Art (Zeilenanfang) geprüft werden und je Art bestimmte Variablen aus den Inhalten addiert werden. Das zerlegen der Zeilen ist kein Problem. Eine While-Schleife scheidet aus, weil ich durch die Pipe nicht ohne gewürge ausserhalb der Schleife an die Variablen komme.

Unnötiges gzip -d $FILE und anschliessendem gzip -9 $FILE auf die Datei will ich vermeiden. Auch sollen möglichst keine temporären Dateien angelegt werden (um die Datei vorher zu entpacken).

Habe ich in der Bash da irgendeine Möglichkeit?

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

Re: Bash-Script: Zeilenweise aus komprimierter Datei lesen

Beitrag von JTH » 14.04.2023 11:30:23

Ich versteh noch nicht so ganz, was du vorhast.
rannseier hat geschrieben: ↑ zum Beitrag ↑
14.04.2023 11:17:56
und anschliessendem gzip -9 $FILE auf die Datei
Du willst die (komprimierte) Datei in der Schleife oder an anderer Stelle also auch bearbeiten, nicht nur auslesen?

Ansonsten: Wenn du tatsächlich explizit die Bash benutzt, nicht auf Posix-Shell beschränkt bist, kannst du eine Process Substitution nehmen. Damit vermeidet man, dass die while-Schleife in einer Subshell läuft:

Code: Alles auswählen

while read -r line; do
    : # do something nice
done < <( cat some_large_file.foobar )
Das cat hier nur als Platzhalter (für zcat o.ä.) – wenn man nur eine unkomprimierte Datei einlesen will, reicht natürlich done < some_large_file.foobar und ist auch schneller.
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: Bash-Script: Zeilenweise aus komprimierter Datei lesen

Beitrag von MSfree » 14.04.2023 11:33:22

rannseier hat geschrieben: ↑ zum Beitrag ↑
14.04.2023 11:17:56
Die Zeilen müssen auf Art (Zeilenanfang) geprüft werden und je Art bestimmte Variablen aus den Inhalten addiert werden.
Eine While-Schleife scheidet aus, weil ich durch die Pipe nicht ohne gewürge ausserhalb der Schleife an die Variablen komme.
Danke für die äußerst undurchsichtige Beschreibung deines Problems.

Von welchen Variablen schprichst du? Dein obiges Besipielt enthält genau zwei Variablen, nämlich FILE und COUNT, und die sind völlig problemlos auch ausserhalb der Schleife zugänglich. Verwechselst du hier Variable und Wert?

Und wenn du while für unbrauchbar hälst, warum nimmst du while in deinem Beispiel?

Wahrscheinlich mußt du streng geheime Unterlagen von der NSA verarbeiten, sonst würdest du dein Problem auf einer etwas weniger dubiosen Ebene beschreiben.

Antworten