【问题标题】:Generate Gnuplot Datablock by Shell command通过 Shell 命令生成 Gnuplot 数据块
【发布时间】:2020-02-22 20:21:57
【问题描述】:

我有一个相当昂贵的 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) 中的第一个。

我觉得可能有更简单的方法可以实现我最初的目标,但到目前为止我还没有找到。

【问题讨论】:

    标签: shell gnuplot


    【解决方案1】:

    现在我似乎有了一个包含我想要的数据块,因为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 $DATAprint output 的组合会生成一个只有一个元素的数组:1 2 3\n4 5 6\n7 8 9,打印到数据块中不会将字符串拆分为单独的行。

    print $DATA 看不到差异。数据块的新数组元素以及数组元素中的\n 都会生成换行符。

    您可以使用load '&lt; 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 
    

    (灵感来自gnuplot: load datafile 1:1 into datablock

    【讨论】:

      【解决方案2】:

      假设我正确理解了您的问题,我看到了版本 2 和 3 应该可以工作的三个版本。我想第 2 版是你想要避免的。为什么第一个版本不起作用我只能猜测。我的怀疑与行尾字符有关。如果您写入数据块(版本 1)或文件(版本 3),似乎会有所不同。我记得与@Ethan 讨论过这个……但我还是不明白自己。我假设您正在使用 Linux,在 Windows 中使用 &amp; 而不是 ;

      代码:

      ### 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
      

      【讨论】:

      • 感谢您的分析。很高兴知道操作系统在这里发挥了作用。对于 Windows 不能说太多,因为你是对的,我使用的是 Linux。但是在 Linux 版本 1 上,无论 shell 命令生成哪个行结束标记,都会生成一个似乎是单行的数据块(我尝试了 Linux 典型的 LF 和 Windows 典型的 CR-LF,结果相同)。版本 2 我不能使用,我的 shell 命令是一个。版本 3 将是临时文件始终存在的所有缺点的解决方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 2014-06-25
      • 2019-02-05
      相关资源
      最近更新 更多