gnuplot stdin, как построить две линии? - PullRequest
26 голосов
/ 03 января 2011

Я пытаюсь создать график из двух линий, используя данные, взятые из stdin. У меня есть файл "test.csv":

0,1.1,2
1,2,3
2,6,4
4,4.6,5
5,5,6

Я пытался построить это с помощью команд типа

$ cat test | gnuplot -p -e "set datafile separator \",\"; plot '-' using 1:2 with lines, '' using 1:3 with lines;"

Но что бы я ни пытался,

line 5: warning: Skipping data file with no valid points

Полагаю, это связано с тем, что для второй строки stdin уже исчерпан. Есть ли способ заставить gnuplot получать данные из каждого столбца стандартного ввода для разных графиков?

Спасибо.

Ответы [ 9 ]

14 голосов
/ 21 апреля 2011

«-» используется для указания того, что данные следуют за командой заговора.Поэтому, если вы используете его, вам нужно будет сделать что-то вроде:

echo "set datafile separator \",\"; plot '-' using 1:2 with lines, '' using 1:3 with lines;" | cat - datafile.dat | gnuplot -p

(цитирование выше, вероятно, должно быть экранировано).

Что вы ищете, так это:

plot '< cat -'

Теперь вы можете сделать:

cat test | sed ... | gnuplot -p "plot '< cat -' using ..."

Обратите внимание, что вам может потребоваться вводить входные данные через stdin несколько раз, если вы используете опции с plot, например:

cat testfile testfile | gnuplot -p "plot '< cat -' using 1, '' using 2"

В приведенном выше примере тестовый файл должен заканчиваться строкой, в которой указан единственный символ 'e'.

Справочная информация

10 голосов
/ 05 июня 2011

Мне удалось обойти это, отправив данные дважды, заканчивая буквой «е» в отдельной строке после каждого блока.Таким образом, ваш вклад должен выглядеть как

set datafile separator ","; plot '-' using 1:2 with lines, '' using 1:3 with lines
0,1.1,2
1,2,3
2,6,4
4,4.6,5
5,5,6
e
0,1.1,2
1,2,3
2,6,4
4,4.6,5
5,5,6
e
7 голосов
/ 08 апреля 2014

Gnuplot может читать со стандартного ввода, но для каждого оператора построения требуется новый набор данных.Следующее работает отлично:

cat test.csv | gnuplot -p -e "set datafile separator ','; plot '-' using 1:2 w l"

Ошибка появляется, как только вы добавляете вторую команду plot с помощью , '' using 1:3.Для этого вам необходимо отправить данные еще раз, так как первый набор данных не сохраняется внутренне для повторного использования.Итак, для вас две команды печати, следующий фрагмент отлично работает:

echo 'e' | cat test.csv - test.csv | gnuplot -p -e "set datafile separator ','; plot '-' using 1:2 w l, '' using 1:3 w l"

, который записывает файл данных дважды, разделенный e, который указывает конец данных для первой команды печати. ​​

2 голосов
/ 03 января 2011

Я бы попытался преобразовать CSV-файл в разделенный пробелами (при условии, что ни одна из записей не занимает несколько строк), пропустив его через sed вместо установки разделителя:

cat test | sed 's/,/ /g' | gnuplot -p -e "plot '-' using ..."
1 голос
/ 12 августа 2014

Возможно, это старый вопрос, но я нашел интересное решение, основанное на других ответах:

cat filename | awk -- '{print $0} END{print "e"}' | tee -i -a - -

Вывод будет:

"contents of filename"
e
"contents of filename"
e
"contents of filename"
e

Теперь cat и awk работают как обычно, утилита tee, с другой стороны, позволяет нам скопировать в файл стандартный вывод, переданный из предыдущей команды, но этот файл может быть stdin , чтобы мы могли сделать много копий, указав n раз - после -a.

Опция -i останавливает его прерывание сигналами во время копирования, -a говорит ему добавить вход к стандартному входу без перезаписи и затем записать все это в stdout .

Для справки взгляните на Tee Utility

0 голосов
/ 30 ноября 2017

Мне пришлось сделать следующее, так как добавление '-' у меня не сработало:

 cat filename | awk -- '{print $0} END{print "e"}' | tee -i -a /dev/stdout /dev/stdout 
0 голосов
/ 15 апреля 2017

Вы пробовали диаграмму ?Ваш случай будет так же прост:

cat test | chart line ','

И даст вам:

line chart

0 голосов
/ 08 апреля 2014

gnuplot, кажется, нуждается в произвольном доступе (т. Е. Не в stdin), поэтому я думаю, что вы застряли с

# explicitly open "test" file
$ gnuplot -p -e "set datafile separator \",\"; plot 'test' using 1:2 with lines, '' using 1:3 with lines;"
0 голосов
/ 25 января 2011

Для меня это работает, когда я делаю:

set datafile separator ','
plot "test.csv" using 1:2 with lines

похоже, что вы использовали "," для разделителя файлов данных вместо ','

...