Plot 如何从特定行打印文件中的数据,从带有特殊字符串的行开始

Plot 如何从特定行打印文件中的数据,从带有特殊字符串的行开始,plot,gnuplot,Plot,Gnuplot,我正在尝试执行类似的命令 plot "data.asc" every ::Q::Q+1500 using 2 with lines 但我对那个“Q”数字有问题。它不是一个已知的值,而是带有特定字符串的行数。假设我有一条带有字符串“SET_10:”的线,然后我有数据在这条特定的线之后绘制。有什么方法可以用特定的字符串识别该行的编号吗?一种简单的方法是通过GNUsed传递数据,只打印想要的行: plot "< sed -n <data.asc '/^SET_10:/,+1500{/^

我正在尝试执行类似的命令

plot "data.asc" every ::Q::Q+1500 using 2 with lines 

但我对那个“Q”数字有问题。它不是一个已知的值,而是带有特定字符串的行数。假设我有一条带有字符串“SET_10:”的线,然后我有数据在这条特定的线之后绘制。有什么方法可以用特定的字符串识别该行的编号吗?

一种简单的方法是通过GNU
sed
传递数据,只打印想要的行:

plot "< sed -n <data.asc '/^SET_10:/,+1500{/^SET_10:/d;p}'" using 1:2 with lines 
如果这没有输出数据的前5行,另一种方法是使用
awk
,因为在
sed
中,如果没有此GNU特定语法,则很难计算行数。测试(标准POSIX,非GNU特定)awk等效物:

awk <data.asc 'end!=0 && NR<=end{print} /^start/{end=NR+5}'

awk这里有一个完全在gnuplot中的版本,不需要外部命令。我使用以下
bash
命令在
gnuplot 5.0 patchlevel 3
上测试了这一点,以创建一个包含20行的简单数据集,其中只有5行将从第1列中带有“start”的行打印出来。你不需要这样做

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使用一个变量
endlno
和一个函数
f
,该函数最初设置为NaN(非数字),该函数包含3个参数:一个布尔值
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-谢谢您的回复。但是,这个命令对我不起作用。出现错误“x范围无效”。你说的话也很难读懂。你提到的a和b是什么?我没有看到您的产品线中使用了任何操作系统。您没有说明您使用的是什么操作系统,因此我假设您使用的是Unix版本。我用另一个选项更新了我的答案。a,b只是引用sed命令的
/^SET\u 10:/,+1500
部分的一种快捷方式。你说得对,这并不明显。
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 -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 
!