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.

124
demandé sur Yun Huang 2012-09-08 10:28:34

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
160
répondu Jari Laamanen 2014-01-27 20:02:39

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.

41
répondu vagoberto 2015-08-04 19:18:03

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
26
répondu Thor 2016-04-24 06:11:38

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)

20
répondu Mo3bius 2014-06-17 20:29:03

Vous pouvez utiliser trick dans un environnement unix/linux:

  1. Dans le programme gnuplot: terrain "/ dev / stdin"...

  2. En ligne de commande: programme gnuplot.parcelle

14
répondu arto 2013-12-09 12:20:02

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.

7
répondu bp. 2018-05-09 14:59:04

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.

5
répondu Stefan 2013-12-06 17:11:12

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.

3
répondu Aniruddha Bera 2017-04-20 15:16:47

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 
2
répondu con-f-use 2014-06-21 14:09:30