Comment passer l'argument de ligne de commande à gnuplot?
Je veux utiliser gnuplot pour dessiner la figure du fichier de données, disons foo.les données. Actuellement, j'ai codé en dur le nom du fichier de données dans le fichier de commande, disons foo.plt , et exécutez la commande gnuplot foo.plg
pour tracer les données. Cependant, je veux passer le nom du fichier de données en tant qu'argument de commande, par exemple en cours d'exécution de la commande gnuplot foo.plg foo.data
. Comment analyser les arguments de ligne de commande dans le fichier de script gnuplot? Grâce.
9 réponses
Vous pouvez entrer des variables via switch -e
$ gnuplot -e "filename='foo.data'" foo.plg
Foo.plg vous pouvez alors utiliser cette variable
$ cat foo.plg
plot filename
pause -1
Pour faire " foo.plg " un peu plus générique, utilisez un conditionnel:
if (!exists("filename")) filename='default.dat'
plot filename
pause -1
Vous pouvez passer des arguments à un script gnuplot depuis la version 5.0, avec l'indicateur -c
. Ces arguments sont accessibles via les variables ARG0
pour ARG9
, ARG0
étant le script, et ARG1
à ARG9
variables de chaîne de caractères. Le nombre d'arguments est donné par ARGC
.
Par exemple, le script suivant ("script.gp")
#!/usr/local/bin/gnuplot --persist
THIRD=ARG3
print "script name : ", ARG0
print "first argument : ", ARG1
print "third argument : ", THIRD
print "number of arguments: ", ARGC
Peut être appelé comme:
$ gnuplot -c script.gp one two three four five
script name : script.gp
first argument : one
third argument : three
number of arguments: 5
, Ou dans gnuplot comme
gnuplot> call 'script.gp' one two three four five
script name : script.gp
first argument : one
third argument : three
number of arguments: 5
Dans gnuplot 4.6.6 et versions antérieures, il existe un mécanisme call
avec une syntaxe différente (maintenant obsolète). Les arguments sont accessibles via $#
, $0
,...,$9
. Par exemple, le même script ci-dessus ressemble à:
#!/usr/bin/gnuplot --persist
THIRD="$2"
print "first argument : ", "$0"
print "second argument : ", "$1"
print "third argument : ", THIRD
print "number of arguments: ", "$#"
Et il est appelé dans gnuplot comme (rappelez-vous, version
gnuplot> call 'script4.gp' one two three four five
first argument : one
second argument : two
third argument : three
number of arguments: 5
Notez qu'il n'y a pas de variable pour le nom du script, donc $0
est le premier argument, et les variables sont appelées entre guillemets. Il n'y a aucun moyen de l'utiliser directement à partir de la ligne de commande, seulement par des astuces comme celle suggérée par @con-Fu-se.
Vous pouvez également transmettre des informations via l'environnement comme suggéré ici . L'exemple de Ismail Amin est répété ici:
Dans le shell:
export name=plot_data_file
Dans un script Gnuplot:
#! /usr/bin/gnuplot
name=system("echo $name")
set title name
plot name using ($16 * 8):20 with linespoints notitle
pause -1
La réponse de Jari Laamanen est la meilleure solution. Je veux juste expliquer comment utiliser plus de 1 paramètre d'entrée avec des variables shell:
output=test1.png
data=foo.data
gnuplot -e "datafile='${data}'; outputname='${output}'" foo.plg
Et foo.plg:
set terminal png
set outputname
f(x) = sin(x)
plot datafile
Comme vous pouvez le voir, plus de paramètres sont passés avec des points-virgules (comme dans les scripts bash), mais les variables de chaîne doivent être encapsulées avec '' (syntaxe gnuplot, pas syntaxe Bash)
Vous pouvez utiliser trick dans un environnement unix/linux:
Dans le programme gnuplot: terrain "/ dev / stdin"...
En ligne de commande: programme gnuplot.parcelle
Cette question est bien répondu, mais je pense que je peux trouver un créneau à remplir ici, ne serait-ce que pour réduire la charge de travail sur quelqu'un googler comme je l'ai fait. La réponse de vagoberto m'a donné ce dont j'avais besoin pour résoudre ma version de ce problème et je vais donc partager ma solution ici.
J'ai développé un script d'intrigue dans un environnement à jour qui m'a permis de faire:
#!/usr/bin/gnuplot -c
set terminal png truecolor transparent crop
set output ARG1
set size 1, 0.2
rrLower = ARG2
rrUpper = ARG3
rrSD = ARG4
resultx = ARG5+0 # Type coercion required for data series
resulty = 0.02 # fixed
# etc.
Cela s'exécute parfaitement à partir de la ligne de commande dans un environnement avec un gnuplot récent (5.0.3 dans mon cas).
$ ./plotStuff.gp 'output.png' 2.3 6.7 4.3 7
Lorsqu'il est téléchargé sur mon serveur et exécuté, il a échoué car la version du serveur était 4.6.4 (actuelle sur Ubuntu 14.04 LTS). Le shim ci-dessous a résolu ce problème sans nécessiter de modification du script d'origine.
#!/bin/bash
# GPlot v<4.6.6 doesn't support direct command line arguments.
#This script backfills the functionality transparently.
SCRIPT="plotStuff.gp"
ARG1=$1
ARG2=$2
ARG3=$3
ARG4=$4
ARG5=$5
ARG6=$6
gnuplot -e "ARG1='${ARG1}'; ARG2='${ARG2}'; ARG3='${ARG3}'; ARG4='${ARG4}'; ARG5='${ARG5}'; ARG6='${ARG6}'" $SCRIPT
La combinaison de ces deux scripts permet de passer des paramètres de bash aux scripts de gnuplot sans tenir compte de la version de gnuplot et de n'importe quel *nix.
Vous pouvez même faire de la magie shell, par exemple comme ceci:
#!/bin/bash
inputfile="${1}" #you could even do some getopt magic here...
################################################################################
## generate a gnuplotscript, strip off bash header
gnuplotscript=$(mktemp /tmp/gnuplot_cmd_$(basename "${0}").XXXXXX.gnuplot)
firstline=$(grep -m 1 -n "^#!/usr/bin/gnuplot" "${0}")
firstline=${firstline%%:*} #remove everything after the colon
sed -e "1,${firstline}d" < "${0}" > "${gnuplotscript}"
################################################################################
## run gnuplot
/usr/bin/gnuplot -e "inputfile=\"${inputfile}\"" "${gnuplotscript}"
status=$?
if [[ ${status} -ne 0 ]] ; then
echo "ERROR: gnuplot returned with exit status $?"
fi
################################################################################
## cleanup and exit
rm -f "${gnuplotscript}"
exit ${status}
#!/usr/bin/gnuplot
plot inputfile using 1:4 with linespoints
#... or whatever you want
Mon implémentation est un peu plus complexe (par exemple en remplaçant des jetons magiques dans l'appel sed, alors que j'y suis déjà...), mais j'ai simplifié cet exemple pour une meilleure compréhension. Vous pouvez également le rendre encore plus simple.... YMMV.
Dans le shell écrire
gnuplot -persist -e "plot filename1.dat,filename2.dat"
Et consécutivement les fichiers que vous voulez. - persist est utilisé pour que l'écran gnuplot reste aussi longtemps que l'utilisateur ne le quitte pas manuellement.
Encore une autre façon est la suivante:
Vous avez un script gnuplot nommé scriptname.gp
:
#!/usr/bin/gnuplot -p
# This code is in the file 'scriptname.gp'
EPATH = $0
FILENAME = $1
plot FILENAME
Maintenant, vous pouvez appeler le script gnuplot scriptname.gp
par cette paix alambiquée de syntaxe:
echo "call \"scriptname.gp\" \"'.'\" \"'data.dat'\"" | gnuplot