Подтвердить что ты не робот

Gnuplot stdin, как построить две линии?

Я пытаюсь создать график с двумя строками, используя данные, взятые из 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 принимать данные из каждого столбца stdin для разных графиков?

Спасибо.

4b9b3361

Ответ 1

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

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 несколько раз, если вы используете параметры с графиком, например:

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

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

Ручная ссылка

Ответ 2

Мне удалось обойти это, посылая данные дважды, завершая am "e" на собственной строке после каждого блока. Поэтому ваш вход должен выглядеть как

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

Ответ 3

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

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

Ошибка появляется, как только вы добавляете вторую команду построения с помощью , '' 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, который указывает конец данных для первой команды построения.

Ответ 4

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

cat test | sed 's/,/ /g' | gnuplot -p -e "plot '-' using ..."

Ответ 5

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

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' сообщает ей добавлять входной сигнал к стандартному вводу без перезаписи и затем записывать все это в стандартный вывод.

Для справки см. Tee Utility

Ответ 6

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

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

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

Ответ 7

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

# explicitly open "test" file
$ gnuplot -p -e "set datafile separator \",\"; plot 'test' using 1:2 with lines, '' using 1:3 with lines;"

Ответ 8

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

cat test | chart line ','

И даст вам:

line chart

Ответ 9

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

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