Gnuplot को कमांड लाइन तर्क कैसे पास करें?


148

मैं gnuplot का उपयोग डेटा फ़ाइल से आंकड़ा आकर्षित करने के लिए करना चाहता हूं, foo.data कहते हैं । वर्तमान में, मैंने कमांड फ़ाइल में डेटा फ़ाइल नाम को हार्डकोड किया है, foo.plt , और gnuplot foo.plgडेटा को प्लॉट करने के लिए कमांड चलाएं । हालाँकि, मैं डेटा फ़ाइल नाम को कमांड तर्क के रूप में पारित करना चाहता हूं, उदाहरण के लिए कमांड चलाना gnuplot foo.plg foo.data। Gnuplot स्क्रिप्ट फ़ाइल में कमांड लाइन तर्क कैसे पार्स करें? धन्यवाद।

जवाबों:


191

आप चर के माध्यम से स्विच कर सकते हैं -e

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

Foo.plg में आप उस चर का उपयोग कर सकते हैं

$ cat foo.plg 
plot filename
pause -1

"Foo.plg" को थोड़ा और सामान्य बनाने के लिए, एक सशर्त का उपयोग करें:

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

ध्यान दें कि -eफ़ाइल नाम से पहले करना होगा अन्यथा फ़ाइल -eबयानों से पहले चलती है । विशेष रूप से, CLI तर्कों के #!/usr/bin/env gnuplotसाथ एक शेबंग gnuplot चलाने से ./foo.plg -e ...प्रदान की गई दलीलों का उपयोग करने पर ध्यान नहीं दिया जाएगा।


20
यह ifडिफॉल्ट की आपूर्ति के साथ भी इस्तेमाल किया जा सकता है । if ! exists("filename") filename='default.data'
mgilson

10
अब इस पर ठोकर खा रहे लोगों के लिए, mgilson की टिप्पणी और Gnuplot 4.6 पैचवेल 3 की आवश्यकता if (!exists("filename")है if ! exists("filename")
सैम मुसम्मन

खिड़कियों में एक ही काम कैसे करें?
पदवन

6
@Chong: या तो उन्हें एक साथ स्ट्रिंग करें या हर एक को -eतर्क में दें, जैसे -e "filename='default.data'; foo='bar'"या -e "filename='default.data'" -e "foo='bar"'
थोर

1
नोट:-e ... विकल्प फ़ाइल नाम पूर्व में होना करने के लिए है। वास्तव में man gnuplotहम पढ़ सकते हैं: -e" इनपुट सूची" अगली इनपुट फ़ाइल को लोड करने से पहले अनुरोधित कमांड को निष्पादित करता है ।
हस्त्तूर

57

आप संस्करण 5.0 से ध्वज के साथ एक gnuplot स्क्रिप्ट के लिए तर्क पारित कर सकते हैं -c। इन तर्कों चर के माध्यम से पहुँचा रहे हैं ARG0करने के लिए ARG9, ARG0जा रहा है स्क्रिप्ट, और ARG1करने के लिए ARG9स्ट्रिंग चर। तर्कों की संख्या द्वारा दिया गया है ARGC

उदाहरण के लिए, निम्नलिखित स्क्रिप्ट ("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 

के रूप में बुलाया जा सकता है:

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

या के रूप में gnuplot के भीतर

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 और इससे पहले, callएक अलग (अब पदावनत) सिंटैक्स के साथ एक तंत्र मौजूद है । तर्क के माध्यम से पहुँचा रहे हैं $#, $0, ..., $9। उदाहरण के लिए, ऊपर दी गई स्क्रिप्ट समान दिखती है:

#!/usr/bin/gnuplot --persist

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

और इसे gnuplot के भीतर कहा जाता है (याद रखें, संस्करण <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

ध्यान दें कि स्क्रिप्ट नाम के लिए कोई चर नहीं है, इसलिए $0पहला तर्क है, और चर को उद्धरण के भीतर कहा जाता है। कमांड लाइन से सीधे इसका उपयोग करने का कोई तरीका नहीं है, केवल ट्रिक के माध्यम से जैसा कि @ con-fu-se द्वारा सुझाया गया है।


मैंने -cएक स्क्रिप्ट के साथ स्विच का उपयोग करने की कोशिश की जिसमें लाइनें शामिल हैं जैसे कि plot 'data' using 0:($1/100)gnuplotत्रुटि के साथ मरता अमान्य अभिव्यक्ति क्योंकि $1गायब हो गया है। मैं गलत कहाँ हूँ? ध्यान दें कि इसके बिना -cस्क्रिप्ट सुचारू रूप से चलती है।
lorcap

मैंने gnuplot 5.0इन उदाहरणों को एक पंक्ति की तरह जोड़कर इसका परीक्षण किया plot 'data' using 0:($1/100), और जो आप कहते हैं वह नहीं मिला। यह दुर्लभ होगा, क्योंकि यह संस्करण चर को परिभाषित करता है ARG0- ARG9और नहीं $1- $9। मुझे लगता है कि आपके पास संस्करण 5.0 (क्या आप?) है, क्योंकि -cध्वज पहले के संस्करणों द्वारा समर्थित नहीं है। मुझे यह देखने के लिए एक न्यूनतम स्क्रिप्ट देखने की आवश्यकता है कि वास्तविक समस्या कहां है: /
vagoberto

मैं साइबरविन केgnuplot 5.0 patchlevel 0 तहत चल रहा हूं । एक-लाइन स्क्रिप्ट सही रूप से पारित मूल्य को प्रिंट करती है और फिर स्लैश में इंगित त्रुटि अमान्य अभिव्यक्ति के साथ बाहर निकलती है । print ARG1; plot 'data' using 0:($1/100)ARG1print ARG1; plot 'data' using 0:(/100)
lorcap

27

जैसा कि यहाँ सुझाया गया है, आप पर्यावरण के माध्यम से भी जानकारी दे सकते हैंइस्माइल अमीन द्वारा उदाहरण यहाँ दोहराया गया है:

खोल में:

export name=plot_data_file

Gnuplot स्क्रिप्ट में:

#! /usr/bin/gnuplot

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

6
निर्यात के बजाय, आप टाइप कर सकते हैं name=plot_data_file ./the_gnuplot_script
एडगर बोनट

@ एडगर बोनट: इसके लिए कौन सा gnuplot संस्करण आवश्यक है? यह y मशीन पर काम करने के लिए प्रतीत नहीं होता है जो 4.2 का उपयोग करता है ...
Bjoern

हाय @ बज़र्न! मैं Gnuplot 4.6 का उपयोग कर रहा हूं, लेकिन यह Gnuplot सुविधा नहीं है, यह शेल की एक विशेषता है: name=value commandशेल को इसके वातावरण में उस विशेष चर के साथ कमांड को चलाने के लिए कहता है। मैं bash 4.3.11 का उपयोग कर रहा हूं, लेकिन मेरा मानना ​​है कि यह एक बहुत ही सामान्य शेल फीचर है।
एडगर बोनट

23

जरी लामेनन का जवाब सबसे अच्छा समाधान है। मैं केवल यह बताना चाहता हूं कि शेल चरों के साथ 1 से अधिक इनपुट पैरामीटर का उपयोग कैसे करें:

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

और foo.plg:

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

जैसा कि आप देख सकते हैं, अधिक पैरामीटर अर्ध कॉलन (जैसे बश लिपियों) के साथ पारित किए जाते हैं, लेकिन स्ट्रिंग चर को '' (gnuplot सिंटैक्स, नॉट बैश सिंटैक्स) के साथ संलग्न किया जाना चाहिए


1
यदि आप उपयोग करते हैं 'या "स्ट्रिंग्स के लिए gnuplot स्वयं के लिए यह महत्वपूर्ण नहीं है । -eतर्क के चारों ओर बाहरी उद्धरणों "को बैश चर को प्रतिस्थापित करना होगा। निम्नलिखित भी ठीक काम करता है:OUTPUT=foobar; gnuplot -e "output=\"$OUTPUT\"; print output"
क्रिस्टोफ

यह पुष्टि करने के लिए धन्यवाद कि मैं कमांड को विभाजित करने के लिए अर्ध कॉलन का उपयोग कर सकता हूं। अन्य कोई भी उत्तर यह नहीं दिखाता है।
tommy.carstensen

14

आप यूनिक्स / लिनक्स वातावरण में चाल का उपयोग कर सकते हैं:

  1. gnuplot कार्यक्रम में: प्लॉट "/ देव / स्टडिन" ...

  2. कमांड लाइन में: gnuplot program.plot <data.dat


12

इस प्रश्न का उत्तर अच्छी तरह से दिया गया है, लेकिन मुझे लगता है कि मैं यहां पर ध्यान देने के लिए एक आला जगह पा सकता हूं, अगर केवल किसी ऐसे व्यक्ति पर काम का बोझ कम करना है जैसे मैंने किया था। आवारा से जवाब ने मुझे इस समस्या के मेरे संस्करण को हल करने के लिए जो आवश्यक था वह दिया और इसलिए मैं यहां अपना समाधान साझा करूंगा।

मैंने एक अद्यतित वातावरण में एक प्लॉट स्क्रिप्ट विकसित की, जिसने मुझे करने की अनुमति दी:

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

यह हाल के gnuplot (मेरे मामले में 5.0.3) वाले वातावरण में कमांड-लाइन से पूरी तरह से अच्छी तरह से निष्पादित होता है।

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

जब मेरे सर्वर पर अपलोड किया गया और निष्पादित किया गया, तो यह विफल हो गया क्योंकि सर्वर संस्करण 4.6.4 था (उबंटू 14.04 एलटीएस पर वर्तमान)। नीचे दी गई शिम ने मूल स्क्रिप्ट में किसी भी बदलाव की आवश्यकता के बिना इस समस्या को हल किया।

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

इन दो लिपियों के संयोजन से मापदंडों को ग्नूप्लॉट लिपियों के लिए bn से gnuplot संस्करण की परवाह किए बिना और मूल रूप से किसी भी * nix में पारित करने की अनुमति मिलती है।


5

आप कुछ शैल जादू भी कर सकते हैं, जैसे:

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

मेरा कार्यान्वयन थोड़ा अधिक जटिल है (उदाहरण के लिए, मैं कॉल में कुछ मैजिक टोकन बदल रहा हूं, जबकि मैं पहले से ही उस पर हूं ...), लेकिन मैंने बेहतर समझने के लिए इस उदाहरण को सरल बनाया। आप इसे और भी सरल बना सकते हैं .... YMMV।


4

खोल में लिखते हैं

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

और लगातार फ़ाइलें जो आप चाहते हैं। -persist का उपयोग gnuplot स्क्रीन को तब तक करने के लिए किया जाता है जब तक उपयोगकर्ता इसे मैन्युअल रूप से बाहर नहीं करता है।


Win7 कंसोल में, विकल्प -persist काम नहीं कर रहा है? उदाहरण के लिए, gnuplot -persist -c "myscript.plt" "mydata.csv" "myoutput.png"यह कमांड पूरी तरह से काम करता है और मुझे "myoutput.png" फाइल मिलती है, जैसा कि मैं उम्मीद करता हूं, लेकिन gnuplot स्क्रीन प्रकट नहीं होती है ( exitmyscript.plt में NO कमांड)। क्यों? और मेरे उदाहरण में gnuplot स्क्रीन शो कैसे करें?
lyl

1

अभी तक एक और तरीका यह है:

आपके पास एक gnuplot स्क्रिप्ट नाम है scriptname.gp:

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

plot FILENAME

अब आप scriptname.gpवाक्य रचना की इस जटिल शांति से gnuplot स्क्रिप्ट को कॉल कर सकते हैं :

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

0

@ योनि के उत्तर का सबसे अच्छा IMHO लगता है यदि आपको स्थिति संबंधी तर्क की आवश्यकता है , और मुझे जोड़ने के लिए एक छोटा सुधार है।

योनि के सुझाव:

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

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

जिसे कहा जाता है:

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

अपने जैसे आलसी टाइपर्स के लिए, कोई स्क्रिप्ट को निष्पादन योग्य बना सकता है ( chmod 755 script.gp)

तो निम्नलिखित का उपयोग करें:

#!/usr/bin/env gnuplot -c

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

और इसे निष्पादित करें:

$ ./imb.plot a b c d
script name        : ./imb.plot
first argument     : a
third argument     : c
number of arguments: 4
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.