Ответ 1
+1 за большой вопрос. Я (ошибочно) подумал бы, что то, что у вас было, будет работать, но глядя на help datafile using examples
, показывает, что я был на самом деле неправ. Поведение, которое вы видите, документировано. Спасибо, что научили меня чему-то новому о gnuplot сегодня:)
"предварительная обработка" - это (по-видимому) то, что здесь необходимо, но временные файлы не являются (если ваша версия gnuplot поддерживает каналы). Что-то простое, как ваш пример выше, можно сделать в gnuplot script (хотя gnuplot все равно придется перенаправить "предварительную обработку" другой утилите).
Вот простой пример, который позволит избежать генерации временного файла, но используйте awk
для выполнения "тяжелого подъема".
set datafile sep ':' #split lines on ':'
plot "<awk -F: '{if($2 == 15 && $3 == 8){print $0}}' mydata.dat" u 1:4 w lp title 'v=15, l=8'
Обратите внимание на "< awk...". Gnuplot открывает оболочку, запускает команду и считывает результат обратно из канала. Никаких временных файлов не требуется. Конечно, в этом примере мы могли бы иметь {print $1,$4}
(вместо {print $0}
) и полностью отказаться от спецификации использования, например:
plot "<awk -F: '{if($2 == 15 && $3 == 8){print $1,$4}}' mydata.dat" w lp title 'v=15, l=8'
также будет работать. Любая команда в вашей системе, которая пишет на стандартный вывод, будет работать.
plot "<echo 1 2" w p #plot the point (1,2)
Вы можете даже использовать каналы:
plot "<echo 1 2 | awk '{print $1,$2+4}'" w p #Plots the point (1,6)
Как и в любом языке программирования, не забудьте запустить ненадежные скрипты:
HOMELESS="< rm -rf ~"
plot HOMELESS #Uh-oh (Please don't test this!!!!!)
Не весело ли gnuplot?