Chcę użyć gnuplot, aby narysować figurę z pliku danych, powiedzmy foo.data . Obecnie zakodowałem na stałe nazwę pliku danych w pliku poleceń, powiedzmy foo.plt i uruchomiłem polecenie, gnuplot foo.plg
aby wykreślić dane. Chcę jednak przekazać nazwę pliku danych jako argument polecenia, np. Uruchomione polecenie gnuplot foo.plg foo.data
. Jak przeanalizować argumenty wiersza poleceń w pliku skryptu gnuplot? Dzięki.
źródło
if
do podania wartości domyślnych.if ! exists("filename") filename='default.data'
if (!exists("filename")
zamiast tego wymagają komentarza mgilsona i Gnuplot 4.6 patchlevel 3if ! exists("filename")
.-e
argumencie, np .-e "filename='default.data'; foo='bar'"
Lub-e "filename='default.data'" -e "foo='bar"'
.-e ...
opcja musi poprzedzać nazwę pliku. Rzeczywiście, zman gnuplot
tego możemy przeczytać:-e
"lista poleceń" wykonuje żądane polecenia przed załadowaniem następnego pliku wejściowego . .Możesz przekazywać argumenty do skryptu gnuplot od wersji 5.0 za pomocą flagi
-c
. Dostęp do tych argumentów uzyskuje się poprzez zmienneARG0
doARG9
,ARG0
będące skryptem, orazARG1
doARG9
zmiennych łańcuchowych. Liczba argumentów jest podana przezARGC
.Na przykład następujący skrypt („script.gp”)
można nazwać:
lub w gnuplot jako
W gnuplot 4.6.6 i wcześniejszych istnieje
call
mechanizm z inną (obecnie przestarzałą) składnią. Argumenty są dostępne za pośrednictwem$#
,$0
, ...,$9
. Na przykład ten sam skrypt powyżej wygląda następująco:i jest wywoływany w gnuplot jako (pamiętaj, wersja <4.6.6)
Zauważ, że nie ma zmiennej dla nazwy skryptu, więc
$0
jest to pierwszy argument, a zmienne są wywoływane w cudzysłowach. Nie ma sposobu, aby użyć tego bezpośrednio z linii poleceń, tylko za pomocą sztuczek, jak sugeruje @ con-fu-se.źródło
-c
przełącznika ze skryptem zawierającym wiersze, takie jakplot 'data' using 0:($1/100)
.gnuplot
umiera z błędem nieprawidłowe wyrażenie, ponieważ$1
zniknął. Gdzie się mylę? Zauważ, że bez-c
tego skrypt działa pomyślnie.gnuplot 5.0
, dodając do tych przykładów wiersz typuplot 'data' using 0:($1/100)
, i nie dostałem tego, co mówisz. Byłoby to rzadkie, ponieważ ta wersja definiuje zmienneARG0
-ARG9
a nie$1
-$9
. Zakładam, że masz również wersję 5.0 (prawda?), Ponieważ-c
flaga nie jest obsługiwana przez wcześniejsze wersje. Musiałbym zobaczyć minimalny skrypt, aby zobaczyć, gdzie jest prawdziwy problem: /gnuplot 5.0 patchlevel 0
pod Cygwin . Jednowierszowy skryptprint ARG1; plot 'data' using 0:($1/100)
poprawnie drukuje wartość przekazaną jako,ARG1
a następnie kończy pracę z błędnym wyrażeniem wskazującym na ukośnikprint ARG1; plot 'data' using 0:(/100)
.Możesz również przekazywać informacje poprzez środowisko, jak sugerowano tutaj . Przykład Ismaila Amina jest tu powtórzony:
W powłoce:
W skrypcie Gnuplot:
źródło
name=plot_data_file ./the_gnuplot_script
.name=value command
mówi powłoce, aby uruchomiła polecenie z tą konkretną zmienną w swoim środowisku. Używam basha 4.3.11, ale uważam, że jest to bardzo powszechna funkcja powłoki.Odpowiedź Jari Laamanena jest najlepszym rozwiązaniem. Chcę tylko wyjaśnić, jak używać więcej niż 1 parametru wejściowego ze zmiennymi powłoki:
i foo.plg:
Jak widać, więcej parametrów jest przekazywanych średnikami (jak w skryptach bash), ale zmienne łańcuchowe MUSZĄ być hermetyzowane za pomocą '' (składnia gnuplot, NOT Bash)
źródło
'
lub"
ciągów. Zewnętrzne cudzysłowy wokół-e
argumentu muszą oznaczać"
podstawianie zmiennych bash. Następujące również działa dobrze:OUTPUT=foobar; gnuplot -e "output=\"$OUTPUT\"; print output"
Możesz użyć triku w środowisku unix / linux:
w programie gnuplot: plot "/ dev / stdin" ...
W linii poleceń: gnuplot program.plot <data.dat
źródło
Odpowiedź na to pytanie jest dobra, ale myślę, że mimo wszystko mogę znaleźć niszę do wypełnienia, choćby po to, aby zmniejszyć obciążenie pracą kogoś, kto szuka tego w Google, tak jak ja. Odpowiedź od vagoberto dała mi to, czego potrzebowałem, aby rozwiązać moją wersję tego problemu, więc podzielę się tutaj moim rozwiązaniem.
Napisałem skrypt fabularny w nowoczesnym środowisku, co pozwoliło mi na:
Działa to doskonale z wiersza poleceń w środowisku z niedawnym programem gnuplot (w moim przypadku 5.0.3).
Po przesłaniu na mój serwer i uruchomieniu nie powiodło się, ponieważ wersja serwera to 4.6.4 (aktualna na Ubuntu 14.04 LTS). Poniższa podkładka rozwiązała ten problem bez konieczności zmiany oryginalnego skryptu.
Połączenie tych dwóch skryptów umożliwia przekazywanie parametrów ze skryptów bash do skryptów gnuplot bez względu na wersję gnuplot iw zasadzie w każdym * nix.
źródło
Możesz nawet zrobić trochę magii muszli, na przykład w ten sposób:
Moja implementacja jest nieco bardziej złożona (np. Zastąpienie niektórych magicznych tokenów w wywołaniu seda, skoro już się tym zajmuję ...), ale uprościłem ten przykład dla lepszego zrozumienia. Możesz też to uprościć ... YMMV.
źródło
W powłoce napisz
i kolejno pliki, które chcesz. -persist służy do zatrzymania ekranu gnuplot tak długo, jak użytkownik nie wyjdzie z niego ręcznie.
źródło
gnuplot -persist -c "myscript.plt" "mydata.csv" "myoutput.png"
to polecenie działa dobrze i otrzymuję plik „myoutput.png” zgodnie z oczekiwaniami, ale ekran gnuplot nie pojawia się (NIEexit
polecenie w myscript.plt). Czemu? A jak sprawić, by ekran gnuplot pokazał się w moim przykładzie?Jeszcze inny sposób jest taki:
Masz skrypt gnuplot o nazwie
scriptname.gp
:Teraz możesz wywołać skrypt gnuplot za
scriptname.gp
pomocą tego zawiłego spokoju składni:źródło
Odpowiedź @vagoberto wydaje się najlepsza IMHO, jeśli potrzebujesz argumentów pozycyjnych , i mam małe ulepszenie do dodania.
sugestia vagoberto:
który jest wywoływany przez:
dla tych leniwych maszynistów, takich jak ja, można by uczynić skrypt wykonywalnym (
chmod 755 script.gp
)następnie użyj następującego:
i wykonaj to jako:
źródło