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.
Bash-Script: Zeilenweise aus komprimierter Datei lesen
Re: Bash-Script: Zeilenweise aus komprimierter Datei lesen
Zeilen kann man mit dem Befehl wc zählen.
Gibt die Anzahl der Zeilen in der Datei ascii.txt aus
würde die Zahl der Zeilen in der mit gzip komprimierten Fassung der Datei ascii.txt ausgeben.
Code: Alles auswählen
wc -l ascii.txt
Code: Alles auswählen
zcat ascii.txt.gz | wc -l
Re: Bash-Script: Zeilenweise aus komprimierter Datei lesen
Kein Problem, da eine Schleife (anders als z.B. eine Pipe) keine Subshell aufmacht.rannseier hat geschrieben:14.04.2023 10:13:40Wichtig ist dabei, dass ich ausserhalb der Schleife an die Variablen komme.
Vielleicht beschreibst du besser mal dein Problem, da möglicherweise noch weiteres (wc; MSfree) Verbesserungspotenzial besteht.
Re: Bash-Script: Zeilenweise aus komprimierter Datei lesen
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?
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?
Re: Bash-Script: Zeilenweise aus komprimierter Datei lesen
Ich versteh noch nicht so ganz, was du vorhast.
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:
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.
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 )
Manchmal bekannt als Just (another) Terminal Hacker.
Re: Bash-Script: Zeilenweise aus komprimierter Datei lesen
Danke für die äußerst undurchsichtige Beschreibung deines Problems.rannseier hat geschrieben:14.04.2023 11:17:56Die 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.
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.