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

时间:2018-08-29 12:54:02

标签: plot gnuplot

我正在尝试执行类似于

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

但是我对那个“ Q”数字有疑问。它不是一个众所周知的值,而是带有一些特定字符串的行数。可以说我有字符串“ SET_10:”行,然后我有要在这条特定行之后绘制的数据。有什么方法可以识别带有特定字符串的那一行的号码吗?

2 个答案:

答案 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:”。