Ich möchte gnuplot verwenden, um Zahlen aus einer Datendatei zu zeichnen, sagen wir foo.data . Derzeit habe ich den Datendateinamen in der Befehlsdatei fest codiert , z. B. foo.plt , und den Befehl ausgeführt gnuplot foo.plg
, um Daten zu zeichnen. Ich möchte jedoch den Datendateinamen als Befehlsargument übergeben, z gnuplot foo.plg foo.data
. B. Befehl ausführen . Wie analysiere ich die Befehlszeilenargumente in der Gnuplot-Skriptdatei? Vielen Dank.
quelle
if
, um Standardeinstellungen bereitzustellen.if ! exists("filename") filename='default.data'
if (!exists("filename")
anstelle vonif ! exists("filename")
.-e
Argument angeben , zB-e "filename='default.data'; foo='bar'"
oder-e "filename='default.data'" -e "foo='bar"'
.-e ...
Option muss vor dem Dateinamen stehen. In der Tatman gnuplot
können wir lesen:-e
"Befehlsliste" führt die angeforderten Befehle aus, bevor die nächste Eingabedatei geladen wird . .Sie können Argumente mit dem Flag an ein Gnuplot-Skript seit Version 5.0 übergeben
-c
. Diese Argumente werden durch die Variablen zugegriffenARG0
zuARG9
,ARG0
das Skript zu sein, undARG1
aufARG9
String - Variablen. Die Anzahl der Argumente ist gegeben durchARGC
.Zum Beispiel das folgende Skript ("script.gp")
kann genannt werden als:
oder innerhalb von gnuplot als
In Gnuplot 4.6.6 und früheren Versionen gibt es einen
call
Mechanismus mit einer anderen (jetzt veralteten) Syntax. Die Argumente werden zugegriffen durch$#
,$0
, ...,$9
. Das obige Skript sieht beispielsweise folgendermaßen aus:und es wird in gnuplot als (denken Sie daran, Version <4.6.6) aufgerufen.
Beachten Sie, dass es keine Variable für den Skriptnamen gibt, ebenso
$0
wie das erste Argument, und die Variablen in Anführungszeichen aufgerufen werden. Es gibt keine Möglichkeit, dies direkt über die Befehlszeile zu verwenden, nur durch Tricks, wie sie von @ con-fu-se vorgeschlagen wurden.quelle
-c
Schalter mit einem Skript zu verwenden, das Zeilen wie enthältplot 'data' using 0:($1/100)
.gnuplot
stirbt mit dem Fehler ungültiger Ausdruck, weil$1
verschwunden ist. Wo irre ich mich Beachten Sie, dass-c
das Skript ohne erfolgreich ausgeführt wird.gnuplot 5.0
indem ich diesen Beispielen eine Zeile wie hinzugefügt habeplot 'data' using 0:($1/100)
, und habe nicht verstanden, was Sie sagen. Es wäre selten, da diese Version die Variablen definiertARG0
-ARG9
und nicht$1
-$9
. Ich gehe davon aus, dass Sie auch Version 5.0 haben (oder?), Da das-c
Flag von früheren Versionen nicht unterstützt wird. Ich würde ein minimales Skript sehen müssen, um zu sehen, wo das eigentliche Problem liegt: /gnuplot 5.0 patchlevel 0
unter Cygwin . Das einzeilige Skriptprint ARG1; plot 'data' using 0:($1/100)
druckt den als übergeben übergebenen Wert korrektARG1
und wird dann mit dem Fehler ungültiger Ausdruck beendet , der auf den Schrägstrich von zeigtprint ARG1; plot 'data' using 0:(/100)
.Sie können Informationen auch wie empfohlen über die Umgebung weitergeben hier . Das Beispiel von Ismail Amin wird hier wiederholt:
In der Shell:
In einem Gnuplot-Skript:
quelle
name=plot_data_file ./the_gnuplot_script
.name=value command
Weist die Shell an, den Befehl mit dieser bestimmten Variablen in ihrer Umgebung auszuführen. Ich verwende Bash 4.3.11, aber ich glaube, es ist eine sehr häufige Shell-Funktion.Die Antwort von Jari Laamanen ist die beste Lösung. Ich möchte nur erklären, wie mehr als 1 Eingabeparameter mit Shell-Variablen verwendet werden:
und foo.plg:
Wie Sie sehen können, werden mehr Parameter mit Semikolons übergeben (wie in Bash-Skripten), aber Zeichenfolgenvariablen MÜSSEN mit '' gekapselt werden (Gnuplot-Syntax, NICHT Bash-Syntax).
quelle
'
oder"
für Zeichenfolgen verwenden. Die äußeren Anführungszeichen um das-e
Argument müssen darin bestehen"
, dass die Bash-Variablen ersetzt werden. Das Folgende funktioniert auch gut:OUTPUT=foobar; gnuplot -e "output=\"$OUTPUT\"; print output"
Sie können Trick in Unix / Linux-Umgebung verwenden:
im Gnuplot-Programm: plot "/ dev / stdin" ...
In der Befehlszeile: gnuplot program.plot <data.dat
quelle
Diese Frage ist gut beantwortet, aber ich denke, ich kann hier eine Nische finden, die ich trotzdem füllen kann, wenn auch nur, um die Arbeitsbelastung für jemanden zu verringern, der so googelt wie ich. Die Antwort von vagoberto gab mir das, was ich brauchte, um meine Version dieses Problems zu lösen, und deshalb werde ich meine Lösung hier teilen.
Ich habe ein Plot-Skript in einer aktuellen Umgebung entwickelt, mit dem ich Folgendes tun konnte:
Dies funktioniert perfekt über die Befehlszeile in einer Umgebung mit einem aktuellen Gnuplot (in meinem Fall 5.0.3).
Beim Hochladen auf meinen Server und Ausführen schlug dies fehl, da die Serverversion 4.6.4 war (aktuell unter Ubuntu 14.04 LTS). Das folgende Shim löste dieses Problem, ohne dass Änderungen am ursprünglichen Skript erforderlich waren.
Die Kombination dieser beiden Skripte ermöglicht die Übergabe von Parametern von Bash- an Gnuplot-Skripte, unabhängig von der Gnuplot-Version und im Grunde genommen in jedem * nix.
quelle
Sie könnten sogar etwas Muschelmagie machen, zB so:
Meine Implementierung ist etwas komplexer (z. B. das Ersetzen einiger magischer Token im sed-Aufruf, während ich bereits dabei bin ...), aber ich habe dieses Beispiel zum besseren Verständnis vereinfacht. Sie könnten es auch noch einfacher machen ... YMMV.
quelle
In die Shell schreiben
und nacheinander die gewünschten Dateien. -persist wird verwendet, um den Gnuplot-Bildschirm so lange zu halten, wie der Benutzer ihn nicht manuell beendet.
quelle
gnuplot -persist -c "myscript.plt" "mydata.csv" "myoutput.png"
funktioniert dieser Befehl einwandfrei und ich erhalte die Datei "myoutput.png" wie erwartet, aber der Gnuplot-Bildschirm wird nicht angezeigt (NO-exit
Befehl in myscript.plt). Warum? Und wie wird der Gnuplot-Bildschirm in meinem Beispiel angezeigt?Ein weiterer Weg ist folgender:
Sie haben ein Gnuplot-Skript mit dem Namen
scriptname.gp
:Jetzt können Sie das Gnuplot-Skript
scriptname.gp
mit dieser verschlungenen Syntax aufrufen :quelle
@ vagobertos Antwort scheint meiner Meinung nach die beste zu sein, wenn Sie Positionsargumente benötigen , und ich muss eine kleine Verbesserung hinzufügen.
Vagobertos Vorschlag:
was aufgerufen wird von:
für diese faulen Schreibmaschinen wie mich könnte man das Skript ausführbar machen (
chmod 755 script.gp
)Verwenden Sie dann Folgendes:
und führen Sie es aus als:
quelle