我正在尝试执行类似于
的命令plot "data.asc" every ::Q::Q+1500 using 2 with lines
但是我对那个“ Q”数字有疑问。它不是一个众所周知的值,而是带有一些特定字符串的行数。可以说我有字符串“ SET_10:”行,然后我有要在这条特定行之后绘制的数据。有什么方法可以识别带有特定字符串的那一行的号码吗?
答案 0 :(得分:0)
一种简单的方法是通过GNU sed
传递数据以仅打印所需的行:
plot "< sed -n <data.asc '/^SET_10:/,+1500{/^SET_10:/d;p}'" using 1:2 with lines
-n
停止任何输出, a,b 指出在哪行之间执行{...}
命令,这些命令说删除触发行,并且{ {1}}打印其他文件。
要确保您具有兼容的GNU p
,请尝试使用该命令,并输入较短的行数,例如5:
sed
如果这不输出数据的前5行,则可以选择使用sed -n <data.asc '/^SET_10:/,+5{/^SET_10:/d;p}'
,因为在awk
中很难计数没有这种GNU特定语法的行。测试等效的(标准POSIX,而不是特定于GNU的)awk:
sed
如果可以,请在gnuplot中将其用作
awk <data.asc 'end!=0 && NR<=end{print} /^start/{end=NR+5}'
答案 1 :(得分:0)
这里是gnuplot内的一个版本,不需要任何外部命令。我使用以下gnuplot 5.0 patchlevel 3
命令在bash
上进行了测试,以创建一个包含20行的简单数据集,其中仅从第1列中带有“开始”的行中打印出5行。需要这样做。
for i in $(seq 1 20)
do let j=i%2
echo "$i $j"
done >data.asc
sed -i data.asc -e '5a\
start'
实际的gnuplot使用最初设置为NaN(非数字)的变量endlno
和具有3个参数的函数f
:布尔值start
表示第1列是否具有匹配的字符串lno
当前行号和当前列1值val
。如果行号小于或等于结束行号(因此它仍然不是NaN),则f
返回val
,否则,如果起始条件为true,则所需的结束行在变量endlno
中设置数字,并返回NaN。如果尚未开始,则返回NaN。
gnuplot -persist <<\!
endlno=NaN
f(start,lno,val) = ((lno<=endlno)?val:(start? (endlno=lno+5,NaN) : NaN))
plot "data.asc" using (f(stringcolumn(1)eq "start", $0, $1)):2 with lines
!
由于gnuplot不会绘制具有NaN值的点,因此我们忽略了直到开始的线段,以及在需要的线数之后的线段。 在您的情况下,您需要将5更改为1500,并将“开始”更改为“ SET_10:”。