Gnuplot'a komut satırı argümanı nasıl iletilir?


148

Gnuplot'u veri dosyasından şekil çizmek için kullanmak istiyorum, örneğin foo.data . Şu anda, veri dosyası adını komut dosyasına, örneğin foo.plt olarak kodladım ve gnuplot foo.plgverilerin grafiğini çizmek için komutu çalıştırdım . Ancak, veri dosyası adını bir komut bağımsız değişkeni olarak iletmek istiyorum, örneğin çalıştırma komutu gnuplot foo.plg foo.data. Gnuplot betik dosyasındaki komut satırı argümanları nasıl ayrıştırılır? Teşekkürler.

Yanıtlar:


194

Değişkenleri anahtar aracılığıyla girebilirsiniz -e

$ gnuplot -e "filename='foo.data'" foo.plg

Foo.plg'de bu değişkeni kullanabilirsiniz

$ cat foo.plg 
plot filename
pause -1

"Foo.plg" ifadesini biraz daha genel yapmak için bir koşul kullanın:

if (!exists("filename")) filename='default.dat'
plot filename
pause -1

-eDosya adından önce gelmesi gerektiğini unutmayın, aksi takdirde dosya -eifadelerden önce çalışır . Özellikle, bir shebang gnuplot'a çalışan #!/usr/bin/env gnuplotile ./foo.plg -e ...CLI argümanlar sağlanan argümanları kullanmak göz ardı eder.


20
Bu aynı zamanda iftedarik varsayılanları için de kullanılabilir . if ! exists("filename") filename='default.data'
mgilson

10
Şimdi bununla karşılaşan insanlar için, if (!exists("filename")bunun yerine mgilson'ın yorumu ve Gnuplot 4.6 yama seviyesi 3 gerekir if ! exists("filename").
Sam Mussmann

Aynı şey pencerelerde nasıl yapılır?
padawan

6
@Chong: Ya onları bir araya getirin ya da her birini bir -eargümanda verin, örneğin -e "filename='default.data'; foo='bar'"veya -e "filename='default.data'" -e "foo='bar"'.
Thor

1
Not:-e ... seçenek dosya adı önce zorundadır. Aslında şunu man gnuplotokuyabiliriz: -e"komut listesi" , bir sonraki girdi dosyasını yüklemeden önce istenen komutları çalıştırır . .
Hastur

59

Sürüm 5.0'dan beri bir gnuplot betiğine bayrakla argümanlar aktarabilirsiniz -c. Bu argümanlar değişkenler aracılığıyla erişilen ARG0için ARG9, ARG0komut ve varlık ARG1için ARG9dize değişkenleri. Argümanların sayısı ile verilir ARGC.

Örneğin, aşağıdaki komut dosyası ("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 

şu şekilde çağrılabilir:

$ gnuplot -c script.gp one two three four five
script name        : script.gp
first argument     : one
third argument     : three
number of arguments: 5

veya gnuplot içinde

gnuplot> call 'script.gp' one two three four five
script name        : script.gp
first argument     : one
third argument     : three
number of arguments: 5

Gnuplot 4.6.6 ve önceki sürümlerde, callfarklı (artık kullanımdan kaldırılmış) sözdizimine sahip bir mekanizma vardır . Argümanlar erişilen $#, $0, ..., $9. Örneğin, yukarıdaki aynı komut dosyası şöyle görünür:

#!/usr/bin/gnuplot --persist

THIRD="$2"
print "first argument     : ", "$0"
print "second argument    : ", "$1"
print "third argument     : ", THIRD
print "number of arguments: ", "$#"

ve gnuplot içinde çağrılır (unutmayın, sürüm <4.6.6)

gnuplot> call 'script4.gp' one two three four five
first argument     : one
second argument    : two
third argument     : three
number of arguments: 5

Komut dosyası adı için değişken olmadığına dikkat edin, bu nedenle $0ilk bağımsız değişken ve değişkenler tırnak içinde çağrılır. Bunu doğrudan komut satırından kullanmanın bir yolu yoktur, sadece @ con-fu-se tarafından önerildiği gibi hilelerle.


-cSwitch'i gibi satırlar içeren bir betik ile kullanmayı denedim plot 'data' using 0:($1/100). geçersiz ifadegnuplot hatası ile ölür çünkü kaybolur. Nerede yanılıyorum Olmadan betiğin başarılı bir şekilde çalıştığını unutmayın. $1-c
lorcap

gnuplot 5.0Bu örneklere şöyle bir satır ekleyerek test ettim plot 'data' using 0:($1/100)ve ne dediğini anlamadım. Bu sürüm değişkenleri tanımladığı için ARG0- ARG9değil $1- tanımladığı için bu nadir bir durumdur $9. -cBayrak önceki sürümler tarafından desteklenmediğinden , sizin de 5.0 sürümüne sahip olduğunuzu varsayıyorum (öyle mi?) . Asıl sorunun nerede olduğunu görmek için minimal bir senaryo görmem gerekiyor: /
vagoberto

Cygwingnuplot 5.0 patchlevel 0 altında koşuyorum . Tek satırlık komut dosyası , olarak geçirilen değeri doğru bir şekilde yazdırır ve bölü işaretini gösteren geçersiz hata ifadesi ile çıkar . print ARG1; plot 'data' using 0:($1/100)ARG1print ARG1; plot 'data' using 0:(/100)
lorcap

28

Ayrıca, burada önerildiği gibi ortama da bilgi aktarabilirsiniz . Ismail Amin'in örneği burada tekrarlanıyor:

Kabukta:

export name=plot_data_file

Bir Gnuplot komut dosyasında:

#! /usr/bin/gnuplot

name=system("echo $name")
set title name
plot name using ($16 * 8):20 with linespoints notitle
pause -1

6
Dışa aktarmak yerine yazabilirsiniz name=plot_data_file ./the_gnuplot_script.
Edgar Bonet

@Edgar Bonet: Bunun için hangi gnuplot sürümü gerekli? 4.2 ... kullanan makinede çalışmıyor gibi görünüyor ...
Bjoern

Merhaba @Bjoern! Ben Gnuplot 4.6 kullanıyorum, ancak bu bir Gnuplot özelliği değil, kabuğun bir özelliği: name=value commandKabuğa, ortamında bu belirli değişkenle komutu çalıştırmasını söyler. Bash 4.3.11 kullanıyorum, ancak bunun çok yaygın bir kabuk özelliği olduğuna inanıyorum.
Edgar Bonet

23

Jari Laamanen'in cevabı en iyi çözümdür. 1'den fazla girdi parametresinin kabuk değişkenleriyle nasıl kullanılacağını açıklamak istiyorum:

output=test1.png
data=foo.data
gnuplot -e "datafile='${data}'; outputname='${output}'" foo.plg

ve foo.plg:

set terminal png
set outputname 
f(x) = sin(x)
plot datafile

Gördüğünüz gibi, noktalı virgüllerle (bash betiklerinde olduğu gibi) daha fazla parametre aktarılır, ancak dize değişkenlerinin '' (gnuplot sözdizimi, Bash sözdizimi DEĞİL) ile sarmalanması GEREKİR


1
Gnuplot'un kendisi için dizeler için 'veya kullanmanız önemli değildir ". -eArgümanın etrafındaki dış tırnak işaretleri ", bash değişkenlerinin ikame edilmesi için olmalıdır . Aşağıdakiler de iyi çalışıyor:OUTPUT=foobar; gnuplot -e "output=\"$OUTPUT\"; print output"
Christoph

Komutları bölmek için noktalı virgül kullanabileceğimi onayladığınız için teşekkürler. Diğer cevapların hiçbiri bunu göstermiyor.
tommy.carstensen

14

Trick'i unix / linux ortamında kullanabilirsiniz:

  1. gnuplot programında: plot "/ dev / stdin" ...

  2. Komut satırında: gnuplot program.plot <data.dat


12

Bu soru iyi yanıtlanmış ancak sanırım burada benim yaptığım gibi Google'da arama yapan birinin iş yükünü azaltmak için olsa bile, burada dolduracak bir yer bulabilirim. Vagoberto'nun cevabı bana bu problemin kendi versiyonumu çözmek için ihtiyacım olan şeyi verdi ve bu yüzden çözümümü burada paylaşacağım.

Güncel bir ortamda, şunları yapmama izin veren bir olay örgüsü senaryosu geliştirdim:

#!/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.

Bu, yeni bir gnuplot (benim durumumda 5.0.3) ile bir ortamda komut satırından mükemmel bir şekilde çalışır.

$ ./plotStuff.gp 'output.png' 2.3 6.7 4.3 7

Sunucuma yüklendiğinde ve yürütüldüğünde, sunucu sürümü 4.6.4 olduğundan (Ubuntu 14.04 LTS'de geçerli) başarısız oldu. Aşağıdaki şim, orijinal senaryoda herhangi bir değişiklik gerektirmeden bu sorunu çözdü.

#!/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

Bu iki komut dosyasının kombinasyonu, parametrelerin gnuplot sürümüne bakılmaksızın ve temelde herhangi bir * nix'te bash'den gnuplot betiklerine aktarılmasına izin verir.


5

Hatta biraz kabuk büyüsü bile yapabilirsiniz, örneğin şöyle:

#!/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

Benim gerçeklemem biraz daha karmaşıktır (örneğin, halihazırda iş başındayken, sed çağrısındaki bazı sihirli simgeleri değiştirmek ...), ancak daha iyi anlamak için bu örneği basitleştirdim. Hatta daha da basitleştirebilirsiniz .... YMMV.


4

Kabukta yaz

gnuplot -persist -e "plot filename1.dat,filename2.dat"

ve art arda istediğiniz dosyalar. -persist, kullanıcı manuel olarak çıkmadığı sürece gnuplot ekranının kalmasını sağlamak için kullanılır.


Win7 konsolunda -persist seçeneği çalışmıyor gibi görünüyor? Örneğin gnuplot -persist -c "myscript.plt" "mydata.csv" "myoutput.png", bu komut iyi çalışıyor ve beklediğim gibi "myoutput.png" dosyasını alıyorum, ancak gnuplot ekranı görünmüyor ( exitmyscript.plt'de NO komutu). Neden? Ve benim örneğimde gnuplot ekran gösterileri nasıl yapılır?
lyl

1

Yine başka bir yol şudur:

Bir gnuplot betiğiniz var scriptname.gp:

#!/usr/bin/gnuplot -p
# This code is in the file 'scriptname.gp'
EPATH = $0
FILENAME = $1 

plot FILENAME

Şimdi gnuplot betiğini scriptname.gpbu kıvrımlı sözdizimi barışıyla çağırabilirsiniz :

echo "call \"scriptname.gp\" \"'.'\" \"'data.dat'\"" | gnuplot 

0

@ vagoberto'nun cevabı konumsal argümanlara ihtiyacınız varsa en iyi IMHO gibi görünüyor ve ekleyeceğim küçük bir iyileştirme var.

vagoberto'nun önerisi:

#!/usr/local/bin/gnuplot --persist

THIRD=ARG3
print "script name        : ", ARG0
print "first argument     : ", ARG1
print "third argument     : ", THIRD 
print "number of arguments: ", ARGC 

tarafından çağrılan:

$ gnuplot -c script.gp one two three four five
script name        : script.gp
first argument     : one
third argument     : three
number of arguments: 5

benim gibi tembel yazanlar için komut dosyası çalıştırılabilir hale getirilebilir ( chmod 755 script.gp)

sonra aşağıdakileri kullanın:

#!/usr/bin/env gnuplot -c

THIRD=ARG3
print "script name        : ", ARG0
print "first argument     : ", ARG1
print "third argument     : ", THIRD
print "number of arguments: ", ARGC

ve şu şekilde yürütün:

$ ./imb.plot a b c d
script name        : ./imb.plot
first argument     : a
third argument     : c
number of arguments: 4
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.