কমান্ড লাইন আর্গুমেন্ট 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বিবৃতি আগে চালিত হয় । বিশেষত, সিএলআই আর্গুমেন্টের #!/usr/bin/env gnuplotসাথে একটি শেবাং গুনুপ্লট চালানো ./foo.plg -e ...প্রদত্ত যুক্তিগুলি উপেক্ষা করবে।


20
এটি ifডিফল্ট সরবরাহ করতেও ব্যবহার করা যেতে পারে । if ! exists("filename") filename='default.data'
মিগিলসন

10
লোকেরা এখন এগুলি নিয়ে হোঁচট খাচ্ছে, তার if (!exists("filename")পরিবর্তে মিলিগ্রামের মন্তব্য এবং Gnuplot 4.6 প্যাচলেভেল 3 প্রয়োজন if ! exists("filename")
স্যাম মুসমান

উইন্ডোজে একই জিনিস কীভাবে করবেন?
padawan

6
@ চঙ: হয় এগুলি একসাথে স্ট্রিং করুন বা প্রত্যেককে একটি -eযুক্তি হিসাবে দিন, যেমন -e "filename='default.data'; foo='bar'"বা -e "filename='default.data'" -e "foo='bar"'
থোর

1
দ্রষ্টব্য:-e ... বিকল্প ফাইলের নাম আগে বসে আছে। প্রকৃতপক্ষে man gnuplotআমরা পড়তে পারি: -e"কমান্ড তালিকা" পরবর্তী ইনপুট ফাইলটি লোড করার আগে অনুরোধ করা আদেশগুলি কার্যকর করে ।
হাস্তুর 16

57

পতাকাটি সহ আপনি 5.0 সংস্করণ থেকে একটি gnuplot স্ক্রিপ্টে যুক্তিগুলি পাস করতে পারেন -c। এই আর্গুমেন্ট ভেরিয়েবল মাধ্যমে ব্যবহার করা হয় ARG0করতে ARG9, ARG0হচ্ছে স্ক্রিপ্ট, এবং ARG1থেকে ARG9স্ট্রিং ভেরিয়েবল। আর্গুমেন্ট সংখ্যা দ্বারা দেওয়া হয় ARGC

উদাহরণস্বরূপ, নিম্নলিখিত স্ক্রিপ্ট ("স্ক্রিপ্ট.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প্রথম যুক্তিও রয়েছে এবং ভেরিয়েবলগুলি উদ্ধৃতিগুলির মধ্যে ডাকা হয়। কমান্ড লাইন থেকে এটি সরাসরি ব্যবহারের কোনও উপায় নেই, কেবল কৌশল হিসাবে যা @ কন-ফু-সে দ্বারা প্রস্তাবিত।


আমি -cকোনও স্ক্রিপ্টের সাথে স্যুইচটি ব্যবহার করার চেষ্টা করেছি যাতে এর মতো লাইন থাকে plot 'data' using 0:($1/100)gnuplotত্রুটি সহ ডাইস অবৈধ অভিব্যক্তি কারণ $1অদৃশ্য হয়। আমি কোথায় ভুল করছি? নোট করুন যে ছাড়া -c, স্ক্রিপ্টটি সফলভাবে চলমান।
লোরক্যাপ

আমি gnuplot 5.0এই উদাহরণগুলির মতো একটি উদাহরণ যুক্ত করে এটি পরীক্ষা করেছি plot 'data' using 0:($1/100)এবং আপনি যা বলছেন তা পেলাম না। এটি বিরল হবে, যেহেতু এই সংস্করণটি ভেরিয়েবলগুলি সংজ্ঞায়িত করে ARG0- ARG9এবং না $1- $9। আমি ধরে নিলাম আপনার কাছে সংস্করণ 5.0 রয়েছে (আপনি কি?), যেহেতু -cপতাকাটি পূর্ববর্তী সংস্করণগুলি দ্বারা সমর্থিত নয়। আসল সমস্যাটি কোথায় তা দেখার জন্য আমার একটি ন্যূনতম স্ক্রিপ্ট দেখতে হবে: /
ভোগোবর্টো

আমি সাইগউইনেরgnuplot 5.0 patchlevel 0 অধীনে চলছে । এক-লাইন স্ক্রিপ্টটি print ARG1; plot 'data' using 0:($1/100)যথাযথভাবে পাস করা মানটি মুদ্রণ করে ARG1এবং এরপরে স্ল্যাশকে নির্দেশ করে ত্রুটি অবৈধ অভিব্যক্তিটি দিয়ে প্রস্থান করে print ARG1; plot 'data' using 0:(/100)
লোরক্যাপ

27

এছাড়াও আপনি পরামর্শ দেওয়া হয় পরিবেশ মাধ্যমে তথ্য প্রেরণ করতে পারেন এখানেইসমাইল আমিনের উদাহরণ এখানে পুনরাবৃত্তি হয়:

শেলের মধ্যে:

export name=plot_data_file

জ্ঞানপ্লট লিপিতে:

#! /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
এডগার বোনেট

@ অ্যাডগার বোনেট: এর জন্য কোন গ্নুপ্লট সংস্করণ প্রয়োজন? দেখে মনে হচ্ছে না যে ওয়াই মেশিনে 4.2 ব্যবহার করা হচ্ছে ...
বিজোর্ন

হাই @ বিজনার! আমি Gnuplot 4.6 ব্যবহার করছি, তবে এটি একটি Gnuplot বৈশিষ্ট্য নয়, এটি শেলের একটি বৈশিষ্ট্য: শেলটিকে name=value commandতার পরিবেশে সেই নির্দিষ্ট ভেরিয়েবলের সাথে কমান্ড চালানোর জন্য বলে। আমি ব্যাশ ৪.৩.১১ ব্যবহার করছি, তবে আমি বিশ্বাস করি এটি খুব সাধারণ শেল বৈশিষ্ট্য।
এডগার বোনেট

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

আপনি দেখতে পাচ্ছেন, আরও প্যারামিটারগুলি আধা কলোন (যেমন ব্যাশ স্ক্রিপ্টগুলির মতো) দিয়ে পাস করা হয়েছে, তবে স্ট্রিং ভেরিয়েবলগুলি '' (এনপ্লট সিনট্যাক্স, ন্যাশ সিনট্যাক্স নয়) দিয়ে আবশ্যক


1
Gnuplot নিজেই জন্য এটা কোন ব্যাপার না যদি আপনি ব্যবহার 'বা "স্ট্রিং জন্য। -eআর্গুমেন্টের চারপাশের বাইরের উক্তিগুলি অবশ্যই "ব্যাশ ভেরিয়েবলগুলি প্রতিস্থাপন করতে হবে। নিম্নলিখিতগুলিও দুর্দান্ত কাজ করে:OUTPUT=foobar; gnuplot -e "output=\"$OUTPUT\"; print output"
ক্রিস্টোফ

কমান্ড বিভক্ত করতে আমি আধা কলোন ব্যবহার করতে পারি তা নিশ্চিত করার জন্য ধন্যবাদ। অন্যান্য উত্তরগুলির কোনওটিই এটি দেখায় না।
tommy.carstensen

14

আপনি ইউনিক্স / লিনাক্স পরিবেশে কৌশল ব্যবহার করতে পারেন:

  1. গ্নুপ্লট প্রোগ্রামে: প্লট "/ দেব / স্টিডিন" ...

  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

যখন আমার সার্ভারে আপলোড করা হয়েছে এবং কার্যকর করা হয়েছে, এটি ব্যর্থ হয়েছে কারণ সার্ভার সংস্করণটি ছিল 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

এই দুটি স্ক্রিপ্টের সংমিশ্রণটি gnuplot সংস্করণ এবং মূলত কোনও * নিক্সকে বিবেচনা না করে প্যাশাগুলি বাশ থেকে gnuplot স্ক্রিপ্টগুলিতে পাস করার অনুমতি দেয়।


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

আমার বাস্তবায়নটি আরও জটিল eg আপনি এটিকে আরও সহজ করে তুলতে পারেন .... ওয়াইএমএমভি।


4

শেল লিখুন

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

এবং ক্রমাগত আপনি চান ফাইল। ব্যবহারকারীরা ম্যানুয়ালি এড়িয়ে না যাওয়া পর্যন্ত gnuplot স্ক্রিনটি স্থির রাখতে ব্যবহার করা হয় pers


উইন 7 কনসোলে, বিকল্প-কর্মী কাজ করছে না বলে মনে হচ্ছে? উদাহরণস্বরূপ, gnuplot -persist -c "myscript.plt" "mydata.csv" "myoutput.png"এই কমান্ডটি ঠিকঠাকভাবে কাজ করে এবং আমি "মাইআউটপুট.পিএনজি" ফাইলটি প্রত্যাশা মতোই পাই, তবে gnuplot স্ক্রিনটি উপস্থিত হয় না ( exitmyscript.plt তে কোনও আদেশ নেই)। কেন? এবং কিভাবে আমার উদাহরণে 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সিনট্যাক্সের এই সংশ্লেষিত শান্তির মাধ্যমে জিনুপ্লট লিপিটি কল করতে পারেন :

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

0

আপনার যদি অবস্থানগত যুক্তিগুলির প্রয়োজন হয় তবে @ ভোবুবার্তোর উত্তরটি সেরা আইএমএইচও বলে মনে হচ্ছে এবং যুক্ত করার জন্য আমার একটি ছোট উন্নতি হয়েছে।

ভোগোবার্তোর পরামর্শ:

#!/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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.