ubuntuusers.de

bash script + gnuplot

Status: Gelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

Bill_Dschirmschoner

Anmeldungsdatum:
5. August 2009

Beiträge: 62

Hallo

ich möchte mir gerne ein script schreiben, das mir ein bisschen arbeit beim messdaten plotten abnimmt. für gewöhnlich schreibe ich die befehle, die ich sonst in die gnuplotkonsole schreiben würde ersteinmal in ein textdokument, also sowas wie

f(x)=a*x+b
fit f(x) 'gplot' via a, b
set xlabel '$\sqrt{l}$ in $\sqrt{cm}$'
set ylabel '$\omega_0$ in $s^{-1}$'
unset key
plot "gplot" using 1:2:3:4 with xyerrorbars, f(x) with line

(in gplot liegen dann messdaten)

dann muss ich gnuplot starten, den terminal mode und den output ändern und diese datei dann per load einlesen. das soll nun ein script für mich übernehmen, das ersteinmal fragt, in welcher datei die plotbefehle liegen und dann selbstständig alles macht. der ansatz sieht wie folgt aus

#!/bin/bash
echo "Name des Plots? "
read name
#!/usr/bin/gnuplot
# plot.eps.gnuplot
set term epslatex
set output '${name}.tex'
load '$name'
set output

die beiden zeilen

#!/usr/bin/gnuplot
# plot.eps.gnuplot

habe ich aus einem anderen script "geklaut" und hab leider keine ahnung was die genau bedeuten. ich dachte die bewirken, dass die nachfolgenden befehle in der gnuplotkonsole ausgeführt würden. dem ist aber scheinbar nicht so. wenn ich das script ausführe bekomme ich nen fehler, dass load kein gültiger befehl ist.

was muss ich also machen, damit die befehle in gnuplot ausgeführt werden?

danke schoneinmal

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Hallo,

die Zeile ALS DATEIANFANG!!

#!/usr/bin/gnuplot

bewirkt - wenn die Datei als 'ausführbar' gesetzt ist - dass zur Interpretation dieser Datei bzw. der restlichen Zeilen, das Programm /usr/bin/gnuplot verwendet wird.

Wenn du also in eine gnuplot-Datei eine solche Zeile als Dateianfang schreibst, läuft dein Script gleich als gnuplot, ohne dass du erst in einem Shell-Script gnuplot aufrufen musst.

Ansosnten: Dinge, die hinter einem Lattenzaun stehen (') sind Kommentare, werden nicht ausgeführt. In einem Script wird die Zeile '# plot.eps.gnuplot' also ignoriert.

Die Variante ...

#!/bin/bash
echo "Name des Plots? "
read name

macht eigentlich niemand; flexibler ist es

#!/bin/bash
name=$1

zu schreiben, wobei '$1' der erste per Kommandozeile übergebene Parameter ist. Also, wenn dein Script 'plotty' heißen würde, stünde nach Aufruf von

plotty meinFileName

in '$1' der String 'meinFileName' (Kannste mal mit echo "Dollar 1 = $1" ausgeben). Das ist aber in der Shell so. Wenn du direkt gnuplot zum Scripten nimmst, musst du erst mal nachschauen, wie gnuplot Argumente aus der Kommandozeile liest ggf. heißen die nicht $1, $2 etc.

Alternativ: es müsste gehen, dass das, was du sonst in der gnuplot-Konsole eintippst, in eine Datei geschrieben an gnuplot gesendet, dieselbe Wirkung hat:

#!/bin/bash

dateiMitMessdaten="$1"

(cat dateiMitANweisungen && echo $dateiMitMessdaten) | gnuplot ...

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

eine Datei 'meineDatei' macht man ausführbar, wenn man

chmod a+x  meineDatei

ausführt.

Dann kann man sie

./meineDatei

im gleichen Verzeichnis aufrufen, sonst eben den Pfad angeben oder in ein Verzeichnis legen, das im $PATH enthalten ist oder Umgebungsvariable PATH anders setzen.

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Sorry,

es muss natürlich so sein, dass das echo deine plot-Zeile enthält

#!/bin/bash

dateiMitMessdaten="$1"

(cat dateiMitAnweisungen && echo "plot $dateiMitMessdaten using 1:2:3:4 with xyerrorbars, f(x) with line) | gnuplot ...

Das cat pustet die Datei rein und das echo ist extra noch hinten dran, damit der Dateiname $dateiMitMessdaten hinter 'plot' eingebaut werden kann.

Bill_Dschirmschoner

(Themenstarter)

Anmeldungsdatum:
5. August 2009

Beiträge: 62

danke für die schnelle antwort

ich hab mir sagen lassen, dass eine übergabe von mehreren befehlen in folge an die gnuplotkonsole nicht ohne weiteres möglich ist. was gnuplot aber kann, ist der befehl

gnuplot 'filename'

dann führt gnuplot die befehle aus, die in der date 'filename' stehen. also bin ich auf die idee gekommen, noch eine datei mehr anzulegen, in der meine standard befehle stehen. dann muss das bash script "nur" noch die zeile mit

load 'plotname'

in der datei mit standard befehlen suchen, und den plotnamen durch den zuvor abgefragten ersetzen.

set term epslatex
set output '${name}.tex'
load '$name'  \\diese zeile muss vom script gesucht und durch load '$name' ersetzt werden ersetzt werden, wobei die '' wichtig sind, da gnuplot sonst streikt
set output

jetzt muss ich nur noch nach nem algorithmus suchen, der zeilen in textdatein sucht und ersetzt^^

(dieses hier ist das erste script, das ich schreibe. dementsprechend viel ahnung hab ich davon)

Bill_Dschirmschoner

(Themenstarter)

Anmeldungsdatum:
5. August 2009

Beiträge: 62

irgendwie ist das edditieren verbuggt

#!/bin/bash
echo "Name des Plots? "
read name
sed 's/^load/load '${name}'/' splot > splot.new
sed 's/^set output '/set output '${name}.tex'/' splot > splot.new
mv -f splot.new splot.txt
rm splot.new
gnuplot splot.txt

so sieht das bis jetzt aus. nur zwei probleme noch: das mit dem "set output '${name}.tex" macht der nicht, da kommt der fehler "syntaxfehler unerwartetes dateiende" in der plot datei für gnuplot muss aber die endung .tex dran sein, damit mir vom plot eine tex datei ausgegeben wird. und die ' zeichen müssen unbedingt in der textdatei hinterher stehen. der sed befehl benutzt diese zeichen jedoch auch, wodurch es zu fehlern kommt

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Bill Dschirmschoner schrieb:

irgendwie ist das edditieren verbuggt

sed 's/^load/load '${name}'/' splot > splot.new
sed 's/^set output '/set output '${name}.tex'/' splot > splot.new

so sieht das bis jetzt aus. nur zwei probleme noch: das mit dem "set output '${name}.tex" macht der nicht, da kommt der fehler "syntaxfehler unerwartetes dateiende" in der plot datei für gnuplot muss aber die endung .tex dran sein, damit mir vom plot eine tex datei ausgegeben wird. und die ' zeichen müssen unbedingt in der textdatei hinterher stehen. der sed befehl benutzt diese zeichen jedoch auch, wodurch es zu fehlern kommt

Dein zweites sed überschreibt das Ergebnis des ersten (beides mal wird splot gelesen und in splot.new geschrieben.

In der zweiten zeile hast du dich mit den Hochkommata verhackt. Die Zeile soll wahrscheinlich set output 'texfile.tex' heißen, wobei texfile aus einer Variablen stammen soll. Das habe ich in meinem Post ja mit dem echo gemacht.

sed   "s/^set output /set output '${name}.tex'/" splot.new > splot.newer

Bill_Dschirmschoner

(Themenstarter)

Anmeldungsdatum:
5. August 2009

Beiträge: 62

jau top jetzt klappts mit

#!/bin/bash
echo "Name des Plots? "
read name
sed "s/^set output .*/set output '${name}.tex'/g" splot.txt > splot.new
sed "s/^load.*/load '${name}'/g" splot.new > splot.newer
mv -f splot.newer splot.txt
gnuplot splot.txt

vielen dank

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Noch ein Tip: - die 3 Zeilen mit sed

sed "s/^set output .*/set output '${name}.tex'/g" splot.txt > splot.new
sed "s/^load.*/load '${name}'/g" splot.new > splot.newer
mv -f splot.newer splot.txt

kann man sehr schön zu einer zusammenfassen:

sed --in-place "s/^set output .*/set output '${name}.tex'/g; s/^load.*/load '${name}'/g" splot.txt

(siehe dazu man sed)

LG,

track

Antworten |