2

所以我正在寻找一些快速而肮脏的解决方案。

问题:

我正在尝试使用 gnuplot 绘制数据文件的特定部分。这可以。基本行类似于

plot "<(sed -n '1,100p' pointsandstuff.dat)" u 1:log($4**2+$5**2) notitle

这工作得很好。我想要的下一步是在我的标题中包含数据的另一部分,即数据条目 $3(列出的点是相同的,所以我可以从任何地方解析它)。我遇到了问题,因为虽然情节看起来不错,但我似乎无法将正则表达式信息输入“标题”。一个不起作用的例子”

plot "<(sed -n '1,100p' pointsandstuff.dat)" u 1:log($4**2+$5**2) title "<(sed -n '1,1p' pointsandstuff.dat)"

(理论上,这会吐出一整条数据线,但实际上我只是得到标题“<(sed ...”)

我尝试使用 bash 脚本来攻击它,但是我使用的 '$' 将 bash 脚本扔进了一个头晕:

#!/bin/bash


STRING=$(echo|sed -n '25001,25001p' pointsandstuff.dat)
echo $STRING


 gnuplot -persist << EOF
 set xrange[:] noreverse nowriteback
 set yrange[:] noreverse nowriteback

 eval "plot "<(sed -n '25001,30000p' pointsandstuff.dat)" u 1:log($4**2+$5**2) title $STRING


EOF

Bash 不知道如何处理 '$4' 和 '$5'。

4

3 回答 3

2

您似乎正在尝试进程替换,但双引号在第一种情况下会阻止它工作,而在第二种情况下您需要命令替换。

你有:

plot "<(sed -n '1,100p' pointsandstuff.dat)" u 1:log($4**2+$5**2) \
      title "<(sed -n '1,1p' pointsandstuff.dat)"

你需要:

plot <(sed -n '1,100p' pointsandstuff.dat) u 1:log($4**2+$5**2) \
      title "$(sed -n '1,1p' pointsandstuff.dat)"

第二种情况下的双引号可能不是绝对必要的,但它们的存在不会出错。

  • 进程替换生成一个文件名并将嵌套命令的输出提供给该文件;该命令认为它正在读取文件(因为它正在读取文件)。

  • 命令替换在字符串中捕获嵌套命令的输出并将该字符串传递给命令(当它用作命令的参数时,如此处)。

于 2012-09-01T00:03:16.277 回答
1

我对这个问题的理解有点模糊,但看起来你想绘制前 100 行——这很容易做到:

plot '< head -100 datafile.dat' u  ....

当然,您可以根据需要使用sed(或awk或...)。仅 gnuplot 的解决方案可能如下所示:

plot 'datafile.dat' u ($0 > 100? 1/0:$1):(log($4**2+$5**2))

或者像这样(对于常规选择更简单):

plot 'datafile.dat' every ::25001::30000 u 1:(log($4**2+$5**2)

并在另一个答案中更详细地解释。

现在,如果您希望标题来自数据文件,您可以使用 gnuplot 解析它backtic substitution

plot ... title "`head -1 datafile.dat | awk '{print $3}'`"

这与 gnuplot 的系统命令基本相同:

plot ... title system("head -1 datafile.dat | awk '{print $3}'")

但在这种情况下,您也许可以使用以下columnhead功能:

plot ... title columnhead(3)
于 2012-09-02T15:50:52.830 回答
0

啊哈,谢谢大家。现在已经想出了一些解决方案——最简单的就是从以前的那些 $s 中转义(我错误地认为 gnuplot 不喜欢......)。到白衣:

STRING=$(echo|sed -n '1,1p' spointsandstuff.dat)
echo $STRING


 gnuplot -persist << EOF
 set xrange[:] noreverse nowriteback
 set yrange[:] noreverse nowriteback

 eval "plot "<(sed -n '1,100p' pointsandstuff.dat)" u 1:(log(\$4**2+\$5**2)) title '$STRING'
 !gv diag_spec.eps &

EOF

不过,谢谢大家——这是玩这些东西的一个很好的借口……希望,如果以后有任何可怜的灵魂看到这个脚本,他们可能会更容易一些。

于 2012-09-03T13:39:41.760 回答