Saya ingin menggunakan gnuplot untuk menggambar angka dari file data, katakan foo.data . Saat ini, saya hardcoded nama file data dalam file perintah, katakan foo.plt , dan jalankan perintah gnuplot foo.plg
untuk memplot data. Namun, saya ingin meneruskan nama file data sebagai argumen perintah, misalnya menjalankan perintah gnuplot foo.plg foo.data
. Bagaimana cara menguraikan argumen baris perintah dalam file skrip gnuplot? Terima kasih.
sumber
if
untuk memasok default.if ! exists("filename") filename='default.data'
if (!exists("filename")
sebagai gantinyaif ! exists("filename")
.-e
argumen, misalnya-e "filename='default.data'; foo='bar'"
atau-e "filename='default.data'" -e "foo='bar"'
.-e ...
opsi memiliki mendahului nama file. Memang dariman gnuplot
kita dapat membaca:-e
"daftar perintah" mengeksekusi perintah yang diminta sebelum memuat file input berikutnya . .Anda bisa meneruskan argumen ke skrip gnuplot sejak versi 5.0, dengan benderanya
-c
. Argumen ini diakses melalui variabelARG0
keARG9
,ARG0
menjadi skrip, danARG1
keARG9
variabel string. Jumlah argumen diberikan olehARGC
.Misalnya, skrip berikut ("script.gp")
dapat disebut sebagai:
atau di dalam gnuplot sebagai
Di gnuplot 4.6.6 dan sebelumnya, ada
call
mekanisme dengan sintaks yang berbeda (sekarang sudah usang). Argumen diakses melalui$#
,$0
, ...,$9
. Misalnya, skrip yang sama di atas terlihat seperti:dan itu disebut di dalam gnuplot sebagai (ingat, versi <4.6.6)
Perhatikan bahwa tidak ada variabel untuk nama skrip, begitu
$0
juga argumen pertama, dan variabel-variabel tersebut disebut dalam tanda kutip. Tidak ada cara untuk menggunakan ini langsung dari baris perintah, hanya melalui trik seperti yang disarankan oleh @ con-fu-se.sumber
-c
sakelar dengan skrip yang berisi baris sepertiplot 'data' using 0:($1/100)
.gnuplot
mati dengan ekspresi kesalahan tidak valid karena$1
dihilangkan. Dimana saya salah Perhatikan bahwa tanpa-c
, skrip berjalan dengan sukses.gnuplot 5.0
menambahkan contoh-contoh ini seperti garisplot 'data' using 0:($1/100)
, dan tidak mengerti apa yang Anda katakan. Ini akan menjadi langka, karena versi ini mendefinisikan variabelARG0
-ARG9
, dan bukan$1
-$9
. Saya berasumsi Anda juga memiliki versi 5.0 (apakah Anda?), Karena-c
bendera tidak didukung oleh versi sebelumnya. Saya perlu melihat skrip minimal untuk melihat di mana masalah sebenarnya: /gnuplot 5.0 patchlevel 0
bawah cygwin . Skrip satu barisprint ARG1; plot 'data' using 0:($1/100)
dengan benar mencetak nilai yang diteruskan sebagaiARG1
dan kemudian keluar dengan kesalahan ekspresi tidak valid yang menunjuk pada garis miringprint ARG1; plot 'data' using 0:(/100)
.Anda juga dapat meneruskan informasi melalui lingkungan seperti yang disarankan di sini . Contoh oleh Ismail Amin diulangi di sini:
Di shell:
Dalam skrip Gnuplot:
sumber
name=plot_data_file ./the_gnuplot_script
.name=value command
memberi tahu shell untuk menjalankan perintah dengan variabel tertentu di lingkungannya. Saya menggunakan bash 4.3.11, tapi saya percaya ini adalah fitur shell yang sangat umum.Jawaban Jari Laamanen adalah solusi terbaik. Saya hanya ingin menjelaskan cara menggunakan lebih dari 1 parameter input dengan variabel shell:
dan foo.plg:
Seperti yang Anda lihat, lebih banyak parameter dilewatkan dengan titik koma (seperti dalam skrip bash), tetapi variabel string PERLU untuk dienkapsulasi dengan '' (sintaks gnuplot, BUKAN sintaks Bash)
sumber
'
atau"
untuk string. Kutipan luar di sekitar-e
argumen harus"
memiliki variabel bash diganti. Yang berikut ini juga berfungsi dengan baik:OUTPUT=foobar; gnuplot -e "output=\"$OUTPUT\"; print output"
Anda dapat menggunakan trik di lingkungan unix / linux:
dalam program gnuplot: plot "/ dev / stdin" ...
Pada baris perintah: gnuplot program.plot <data.dat
sumber
Pertanyaan ini dijawab dengan baik tetapi saya pikir saya dapat menemukan ceruk untuk diisi di sini terlepas, jika hanya untuk mengurangi beban kerja pada seseorang yang melakukan googling seperti ini. Jawaban dari vagoberto memberi saya apa yang saya butuhkan untuk menyelesaikan versi masalah ini dan saya akan membagikan solusi saya di sini.
Saya mengembangkan skrip plot di lingkungan terbaru yang memungkinkan saya untuk melakukan:
Ini dijalankan dengan sangat baik dari command-line di lingkungan dengan gnuplot baru-baru ini (5.0.3 dalam kasus saya).
Ketika diunggah ke server saya dan dieksekusi, gagal karena versi server 4.6.4 (saat ini di Ubuntu 14.04 LTS). Shim di bawah ini menyelesaikan masalah ini tanpa memerlukan perubahan apa pun pada skrip asli.
Kombinasi kedua skrip ini memungkinkan parameter untuk diteruskan dari skrip bash ke gnuplot tanpa memperhatikan versi gnuplot dan pada dasarnya setiap * nix.
sumber
Anda bahkan dapat melakukan beberapa shell magic, misalnya seperti ini:
Implementasi saya sedikit lebih kompleks (misalnya mengganti beberapa token ajaib dalam panggilan sed, sementara saya sudah melakukannya ...), tapi saya menyederhanakan contoh ini untuk pemahaman yang lebih baik. Anda juga bisa membuatnya lebih sederhana .... YMMV.
sumber
Di shell menulis
dan secara berurutan file yang Anda inginkan. -persist digunakan untuk membuat layar gnuplot tetap selama pengguna tidak keluar secara manual.
sumber
gnuplot -persist -c "myscript.plt" "mydata.csv" "myoutput.png"
perintah ini berfungsi dengan baik dan saya mendapatkan file "myoutput.png" seperti yang saya harapkan, tetapi layar gnuplot tidak muncul (TIDAK adaexit
perintah di myscript.plt). Mengapa? Dan bagaimana cara membuat layar gnuplot tampil dalam contoh saya?Namun cara lain adalah ini:
Anda memiliki skrip gnuplot bernama
scriptname.gp
:Sekarang Anda dapat memanggil skrip gnuplot
scriptname.gp
dengan ketenangan sintaks yang berbelit-belit:sumber
@ vagoberto's jawaban tampaknya IMHO terbaik jika Anda memerlukan argumen posisi , dan saya punya sedikit peningkatan untuk ditambahkan.
Saran vagoberto:
yang dipanggil oleh:
untuk pengetik malas seperti saya, orang dapat membuat skrip dapat dieksekusi (
chmod 755 script.gp
)kemudian gunakan yang berikut ini:
dan jalankan sebagai:
sumber