我正在尝试执行类似的命令
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
-n
停止任何输出,a,b表示在哪些行之间执行{...}
命令,这些命令表示删除触发线,p
打印其他行。
为了确保你有一个兼容的GNU sed
自己尝试命令,短线数,例如5:
sed -n <data.asc '/^SET_10:/,+5{/^SET_10:/d;p}'
如果这不输出你的数据的前5行,另一种方法是使用awk
,因为在sed
中很难计算没有这种GNU特定语法的行。测试(标准POSIX,而不是GNU特定)awk等效:
awk <data.asc 'end!=0 && NR<=end{print} /^start/{end=NR+5}'
如果没关系,请在gnuplot中使用它
plot "< awk <data.asc 'end!=0 && NR<=end{print} /^start/{end=NR+1500}'" using 1:2 with lines
这是一个完全在gnuplot中的版本,不需要外部命令。我在gnuplot 5.0 patchlevel 3
上使用以下bash
命令测试了这个,以创建一个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使用最初设置为NaN(非数字)的变量endlno
和带有3个参数的函数f
:布尔值start
表示第1列是否具有匹配的字符串,lno
是当前的亚麻,还是当前的第1列值val
。如果亚麻数小于或等于结束行数(因此它不是NaN),则f
返回val
,否则如果开始条件为真,则在变量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:”。