如何从特定行的文件中绘制数据从一些特殊字符串开始

问题描述 投票:0回答:2

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

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

但我对“Q”号码有疑问。它不是一个众所周知的值,而是具有一些特定字符串的行数。让我说我有字符串“SET_10:”,然后我有我的数据在这条特定的行之后绘制。有没有办法如何识别具有特定字符串的那一行的数量?

plot gnuplot
2个回答
0
投票

一种简单的方法是通过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

0
投票

这是一个完全在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:”。

© www.soinside.com 2019 - 2024. All rights reserved.