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 для разных графиков?
Спасибо.
Ответы
Ответ 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