我正在尝试使用从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的每一列中获取不同图的数据?
感谢。
答案 0 :(得分:14)
“ - ”用于指定数据遵循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"
在上述情况下,testfile必须以一行中包含唯一字符“e”的行结束。
答案 1 :(得分:10)
我设法通过两次发送数据来解决这个问题,在每个块之后通过它自己的行“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
答案 2 :(得分:7)
Gnuplot可以从stdin读取,但是对于每个plot语句,都需要一个新的数据集。以下工作正常:
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
分隔,表示第一个绘图命令的数据结束。
答案 3 :(得分:2)
我尝试将csv文件转换为空格分隔(假设没有记录跨越多行),通过管道sed
而不是设置分隔符:
cat test | sed 's/,/ /g' | gnuplot -p -e "plot '-' using ..."
答案 4 :(得分:1)
也许这是一个老问题,但我找到了一个基于其他答案的有趣解决方案:
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
答案 5 :(得分:0)
对我而言,当我这样做时,这是有效的:
set datafile separator ','
plot "test.csv" using 1:2 with lines
似乎你使用“,”代替','
的数据文件分隔符答案 6 :(得分:0)
gnuplot似乎需要随机访问(即不是标准输入),所以我认为你已经坚持
# explicitly open "test" file
$ gnuplot -p -e "set datafile separator \",\"; plot 'test' using 1:2 with lines, '' using 1:3 with lines;"
答案 7 :(得分:0)
答案 8 :(得分:0)
我必须执行以下操作,因为添加' - '对我来说不起作用:
cat filename | awk -- '{print $0} END{print "e"}' | tee -i -a /dev/stdout /dev/stdout