我有一个相当昂贵的shell命令,它会生成一些应该绘制的输出。输出包含多个曲线的信息,例如。 G。像这样:
echo 1 2 3; echo 4 5 6; echo 7 8 9
应该使用如下命令绘制它们:
plot <something> using 1:2, \
<something> using 1:3
为了避免重复调用shell命令(因为它相当慢),我想将其结果存储在一个数据块中,但是到目前为止,我的试验还没有进行。这是我尝试过的:
output = system("echo 1 2 3; echo 4 5 6; echo 7 8 9")
set print $DATA
print output
unset print
现在我似乎有一个包含我想要的数据块,因为print $DATA
现在打印此:
1 2 3
4 5 6
7 8 9
我希望结尾的空白行不是问题,但也许表明有问题,我不知道。
[当我现在尝试用plot $DATA using 1:2
绘制时,我只得到三个期望点(1 | 2),(4 | 5)和(7 | 8)中的第一个。
我觉得可能有一种更简单的方法可以实现我的最初目标,但到目前为止我还没有找到它。
假设我正确理解了您的问题,我看到了应该在版本2和版本3中起作用的三个版本。我想版本2是您想要避免的。我只能猜测为什么第一个版本不起作用。我怀疑行尾字符。如果写入数据块(版本1)或文件(版本3),似乎有所不同。我记得曾与@Ethan讨论过此事……但我仍然不了解自己。我假设您正在使用Linux,在Windows中使用&
而不是;
。
代码:
### system output to datablock
reset session
# Version 1
set title "Version 1: only plots 1st data line"
output = system("echo 1 2 3 & echo 4 5 6 & echo 7 8 9") # in Windows "&" instead of ";"
set print $Data
print output
set print
plot $Data u 1:2 w lp pt 7
pause -1
# Version 2
set title "Version 2: several system calls"
set print $Data
print system("echo 1 2 3")
print system("echo 4 5 6")
print system("echo 7 8 9")
set print
plot $Data u 1:2 w lp pt 7
pause -1
# Version 3
set title "Version 3: writing into data file"
output = system("echo 1 2 3 & echo 4 5 6 & echo 7 8 9") # in Windows "&" instead of ";"
set print "Data.dat"
print output
set print
plot "Data.dat" u 1:2 w lp pt 7
### end of code
现在我似乎有一个包含我想要的数据块,因为
print $DATA
现在打印此:1 2 3 4 5 6 7 8 9
否,$DATA
不包含您想要的内容。$DATA
应为具有三个元素的数组:第一个元素为1 2 3
,第二个元素为4 5 6
,第三个元素为7 8 9
。相反,output = system("...")
,set print $DATA
和print output
的组合将生成具有仅一个元素:1 2 3\n4 5 6\n7 8 9
的数组,打印到数据块中不会将字符串分成单独的行。
print $DATA
看不到差异。数据块的新数组元素以及数组元素中的\n
两者都产生换行符。
您可以使用load '< XXXXX'
命令生成有用的数据块。从gnuplot文档中:
load
命令执行指定输入文件的每一行,就像它是在交互式输入中一样。...
[在某些支持popen函数(Unix)的系统上,可以通过以'
“ XXXXX”可以是一系列shell命令,这些命令生成必要的gnuplot命令:
load '< echo "\$DATA << EOD" && echo 1 2 3; echo 4 5 6; echo 7 8 9 && echo "EOD"'
print $DATA
plot $DATA using 1:2 pt 5, $DATA using 1:3 pt 7