Grüzi Liste,
Also ich habe mir das ganze jetzt vereinfacht, in dem ich die Files welche nicht gepackt waren, gepackt habe. Dann habe ich folgendes Skript benutzt um die Daten in eine Datei zu schreiben und die Datei danach zu sortieren. -------------------------------------------------------------- for i in "$@"; do zcat $i >> /tmp/test.txt sort +1 -g -t " " /tmp/test.txt > /tmp/sortiert.txt done -------------------------------------------------------------- Jo, sieht gut aus. Wozu das '+1' und '-g'? (rein Neugierdehalber, ich hab bisher mit 'sort' oder 'sort -n' immer alles sortiert bekommen ;) Das '-t " "' sollte IMO ueberfluessig sein (es sei denn, du willst explizit auch tabs als Feldtrenner (fuer '+1'?) ausschliessen)...
Mit dem +1 und -t " " sortiere ich die erste Spalte wobei das Trennzeichen ein Leerzeichen ist. Das -g steht für: Sortierung nach numerischem anstatt alphabetischem Wert. Sprich: 1, 500, 1000 statt 1, 1000, 500.
0. Ich HASSE es, wenn in einer Schleife "$i" fuer Dateinamen verwendet wird. Wenn, dann nehme ich "$f" (file), "$d" (directory|datei), "$v" (verzeichnis), oder am besten sowieso laengere Variablennamen. Also z.B. oben: 'for file in "$@"; ...'
Nur zum Veständniss. Wenn ich sage [ for file in "$@"; ] dann lautet die variable auch $file ?
1. Du quotest "$i" beim zcat nicht. Sobald du einen Dateinamen mit SPACE bekommst: PENG! ;) Ein "${VARIABLENNAME}" ist noch einen Tick sicherer ;)
Ja Richtig, werde ich verbessern. Also ab jetzt Variablen immer in Quotas.
[...] for datei in "$@" do case "$datei" in .bz2) bzcat "${datei}" >> /tmp/test.txt;; .gz) zcat "${datei}" >> /tmp/test.txt;; *) echo "Fehler: kann Datei $datei nicht ..." >&2;; esac done
Mensch, das ist ja einfacher als Datei per if-then-else und test auf Endung zu prüfen und danach zu bearbeiten. Werde ich weiterverarbeiten..
3. Du ueberpruefst weder die Existenz von /tmp/test.txt noch die von /tmp/sortiert.txt [...] Ja! Bisher war das "overkill", aber fuer ein echtes script solltest du besser beide Dateinamen mittels 'mktemp(1)' erzeugen lassen, das bietet zumindest einen (einfachen) und etwas sichereren Weg so eine temporaere Datei anzulegen... [...]
Was ist an diesem Weg denn besser als mittels >> eine Datei anzulegen? Als wirklich reine Arbeitsdatei ist mktemp gar nicht schlecht, auch die Anwendung ist anhand der Beispiels verständlich. Aber hier wird doch von einer wirklich Temporären Verwendung ausgegangen. Ich jedoch wollte schon das File behalten.
Kaum ;) Ich kann wohl zu gut englisch, mir reicht 'man bash' ;)
Zum Lesen, ist es ja auch nicht schlecht, jedoch finde ich das nicht gerade eine leichte Lektüre. Und wie man wirklich ordentlich ein Skript programmiert wird dort auch nicht erläutert, sondern halt nur die technische Seite. Meistens weiß ich jedoch einfach nicht wo ich ansetzen soll. Bezüglich Doku, habe ich auch einen netten kleinen Link gefunden. Kurz und bündig kann ich da nur sagen... http://home.t-online.de/home/M.Luetticken/linux/shskript.htm
Als Anregung/Uebung (*eg*):
a) Erklaere (im Detail) was die folgende Zeile macht und finde einen passenden Namen fuer 'x'
x() { echo "'${1/##*\/}' in '${1%\/*}'"; }
b) was macht dann anschliessend:
x $0
Gibt den Pfad inlusive dem Dateinamen des Skriptes aus und in welchem Pfad er steht. Richtig?? ;-) Gruß Björn
* Bjoern Falkenhagen schrieb am 15.Apr.2002: Bitte die Vorredner, die Du zitierst, auch erwähnen. Dein Vorredner war David, ich gehe mal davon aus, daß Dein Vorvorredner Du selber warst. Ich weiß es aber nicht mehr und suche jetzt auch nicht die Mail aus dem Archiv.
Wozu das '+1' und '-g'? (rein Neugierdehalber, ich hab bisher mit 'sort' oder 'sort -n' immer alles sortiert bekommen ;) Das '-t " "' sollte IMO ueberfluessig sein (es sei denn, du willst explizit auch tabs als Feldtrenner (fuer '+1'?) ausschliessen)...
Mit dem +1 und -t " " sortiere ich die erste Spalte wobei das Trennzeichen ein Leerzeichen ist.
Aber das ist doch Standardmäßig auch schon so. Daß heißt, Standardmäßig wird nach der ersten und dann nach der zweiten usw. Spalte sortiert, wenn bei Dir die erste Spalte gleich ist, wird nicht sortiert. Und Standardmäßig wird sowohl Leerzeichen als auch Tab als Feldtrenner genommen, Du hast nur Leerzeichen, nicht aber Tab. Ist das wichtig?
Das -g steht für: Sortierung nach numerischem anstatt alphabetischem Wert. Sprich: 1, 500, 1000 statt 1, 1000, 500.
Das macht aber auch -n. Wenn ich es richtig verstanden habe, versteht -g auch Fließpunktzahlen. Habe ich aber noch nie gebraucht, kann mich jedenfalls nicht drann entsinnen.
0. Ich HASSE es, wenn in einer Schleife "$i" fuer Dateinamen verwendet wird. Wenn, dann nehme ich "$f" (file), "$d" (directory|datei), "$v" (verzeichnis), oder am besten sowieso laengere Variablennamen. Also z.B. oben: 'for file in "$@"; ...'
Nur zum Veständniss. Wenn ich sage [ for file in "$@"; ] dann lautet die variable auch $file ?
Hmm, nun eigentlich heißt die Variable file und um den Inhalt der Variable zu sehen muß man $file angeben, genauso wie die Variable eigentlich i heißt und wenn man auf den Inhalt der Variable zugreifen möchte muß man $i sagen. Aber es hat sich im allgemeinen Sprachgebrauch eingeschliffen, daß man vor der Variable immer das $ setzt. Bei der shell wird das $ aber, im Gegensatz zu perl, nur beim Aufruf davor gesetzt, nie bei der Definition.
for datei in "$@" do case "$datei" in .bz2) bzcat "${datei}" >> /tmp/test.txt;; .gz) zcat "${datei}" >> /tmp/test.txt;; *) echo "Fehler: kann Datei $datei nicht ..." >&2;; esac done
Mensch, das ist ja einfacher als Datei per if-then-else und test auf Endung zu prüfen und danach zu bearbeiten. Werde ich weiterverarbeiten..
Man beachte das ;; am Ende, daß ist wichtig, das Beendet den einzelnen case.
3. Du ueberpruefst weder die Existenz von /tmp/test.txt noch die von /tmp/sortiert.txt [...] Ja! Bisher war das "overkill", aber fuer ein echtes script solltest du besser beide Dateinamen mittels 'mktemp(1)' erzeugen lassen, das bietet zumindest einen (einfachen) und etwas sichereren Weg so eine temporaere Datei anzulegen... [...]
Was ist an diesem Weg denn besser als mittels >> eine Datei anzulegen?
Wenn das Skript zweimal aufgerufen wird, überschreibt es sich gegenseitig. Das Problem hast Du als Einzeluser ehr nicht, aber Linux ist ein Multiuserbetriebssystem. Wenn Du sowas in einer Multiuserumgebung machst, bekommst Du Probleme. Da sollten die Tempdateien einmalige Namen haben.
Als wirklich reine Arbeitsdatei ist mktemp gar nicht schlecht, auch die Anwendung ist anhand der Beispiels verständlich. Aber hier wird doch von einer wirklich Temporären Verwendung ausgegangen. Ich jedoch wollte schon das File behalten.
Dann ist /tmp der falsche Ort.
Kaum ;) Ich kann wohl zu gut englisch, mir reicht 'man bash' ;)
Zum Lesen, ist es ja auch nicht schlecht, jedoch finde ich das nicht gerade eine leichte Lektüre. Und wie man wirklich ordentlich ein Skript programmiert wird dort auch nicht erläutert, sondern halt nur die technische Seite. Meistens weiß ich jedoch einfach nicht wo ich ansetzen soll.
Stimmt schon. An einem guten Buch geht imho kein Weg vorbei.
Bezüglich Doku, habe ich auch einen netten kleinen Link gefunden. Kurz und bündig kann ich da nur sagen...
http://home.t-online.de/home/M.Luetticken/linux/shskript.htm
Als Anregung/Uebung (*eg*):
a) Erklaere (im Detail) was die folgende Zeile macht und finde einen passenden Namen fuer 'x'
x() { echo "'${1/##*\/}' in '${1%\/*}'"; }
b) was macht dann anschliessend:
x $0
Gibt den Pfad inlusive dem Dateinamen des Skriptes aus und in welchem Pfad er steht. Richtig?? ;-)
Probier es aus. Bernd -- Alle meine Signaturen sind rein zufällig und haben nichts mit dem Text oder dem Schreiber zu tun, dem ich antworte. Falls irgendwelche Unrichtigkeiten dabei sein sollten, so bedauere ich das. Es wäre nett, wenn Du mich benachrichtigen würdest. |Zufallssignatur 0
Hallo, On Mon, 15 Apr 2002, Bernd Brodesser wrote:
* Bjoern Falkenhagen schrieb am 15.Apr.2002:
3. Du ueberpruefst weder die Existenz von /tmp/test.txt noch die von /tmp/sortiert.txt [...] Ja! Bisher war das "overkill", aber fuer ein echtes script solltest du besser beide Dateinamen mittels 'mktemp(1)' erzeugen lassen, das bietet zumindest einen (einfachen) und etwas sichereren Weg so eine temporaere Datei anzulegen... [...]
Was ist an diesem Weg denn besser als mittels >> eine Datei anzulegen?
Wenn das Skript zweimal aufgerufen wird, überschreibt es sich gegenseitig. Das Problem hast Du als Einzeluser ehr nicht, aber Linux ist ein Multiuserbetriebssystem. Wenn Du sowas in einer Multiuserumgebung machst, bekommst Du Probleme. Da sollten die Tempdateien einmalige Namen haben.
ACK! (auch zu allen vorhergegangen Kommentaren von Bernd).
Als wirklich reine Arbeitsdatei ist mktemp gar nicht schlecht, auch die Anwendung ist anhand der Beispiels verständlich. Aber hier wird doch von einer wirklich Temporären Verwendung ausgegangen. Ich jedoch wollte schon das File behalten.
Moment, mktemp generiert dir nur den Dateinamen, den du verwenden kannst, nicht aber die Datei! Siehe das Beispiel in 'man 1 mktemp'.
Dann ist /tmp der falsche Ort.
Ack.
Als Anregung/Uebung (*eg*):
a) Erklaere (im Detail) was die folgende Zeile macht und finde einen passenden Namen fuer 'x'
x() { echo "'${1/##*\/}' in '${1%\/*}'"; }
URGSL! Da ist mir doch glatt was beim reinkopieren danebengegangen! Richtig haette es heissen sollen: x() { echo "'${1##*\/}' in '${1%\/*}'"; } Eine Alternative waere: x() { echo "'${1/#*\/}' in '${1%\/*}'"; } (Sorry!)
b) was macht dann anschliessend:
x $0
Gibt den Pfad inlusive dem Dateinamen des Skriptes aus und in welchem Pfad er steht. Richtig?? ;-)
Probier es aus.
Es geht allerdings nicht darum "was" es macht, sondern "wie" :) -dnh -- / "Congratulations on deriving the density of the intergalactic medium to be \ [ 10^33 kg per cubic meter. That is 1,000,000,000,000,000,000,000,000,000,000 ] \ times more dense than if it was packed full of elephants" -- Frossie /
participants (3)
-
B.Brodesser@t-online.de
-
Bjoern Falkenhagen
-
David Haller