gnuplot将一个数字从数据文件存储到变量中

wha*_*ace 11 variables gnuplot

OSX v10.6.8和Gnuplot v4.4

我有一个包含8列的数据文件.我想从第6列获取第一个值并将其作为标题.这是我到目前为止所拥有的:

#m1 m2 q taua taue K avgPeriodRatio time
#1  2  3   4   5   6        7        8

K = #read in data here
graph(n) = sprintf("K=%.2e",n) 
set term aqua enhanced font "Times-Roman,18"

plot file using 1:3 title graph(K)
Run Code Online (Sandbox Code Playgroud)

以下是我的数据文件的前几行:

1.00e-07 1.00e-07 1.00e+00 1.00e+05 1.00e+04 1.00e+01 1.310 12070.00
1.11e-06 1.00e-07 9.02e-02 1.00e+05 1.00e+04 1.00e+01 1.310 12070.00
2.12e-06 1.00e-07 4.72e-02 1.00e+05 1.00e+04 1.00e+01 1.310 12070.00
3.13e-06 1.00e-07 3.20e-02 1.00e+05 1.00e+04 1.00e+01 1.310 12090.00
Run Code Online (Sandbox Code Playgroud)

我不知道如何正确读取数据,或者这是否是正确的解决方法.

编辑#1

好的,多亏了我现在的mgilson

#m1 m2 q taua taue K avgPeriodRatio time
#1  2  3   4   5   6        7        8

set term aqua enhanced font "Times-Roman,18"
K = "`head -1 datafile | awk '{print $6}'`"
print K+0
graph(n) = sprintf("K=%.2e",n) 

plot file using 1:3 title graph(K)
Run Code Online (Sandbox Code Playgroud)

但我收到错误:找到数字表达式的非数字字符串

编辑#2

file = "testPlot.txt"
K = "`head -1 file | awk '{print $6}'`"
K=K+0  #Cast K to a floating point number  #this is line 9
graph(n) = sprintf("K=%.2e",n)
plot file using 1:3 title graph(K)
Run Code Online (Sandbox Code Playgroud)

这给出了错误 - > head:file:没有这样的文件或目录"testPlot.gnu",第9行:找到数字表达式的非数字字符串

mgi*_*son 14

你有几个选择......

第一选择:

使用 columnheader

plot file using 1:3 title columnheader(6)
Run Code Online (Sandbox Code Playgroud)

我没有测试过,但这可能会阻止第一行实际绘制.

第二种选择:

使用外部实用程序获取标题:

TITLE="`head -1 datafile | awk '{print $6}'`"
plot 'datafile' using 1:3 title TITLE
Run Code Online (Sandbox Code Playgroud)

如果变量是数字,并且您想重新格式化它,则在gnuplot中,您可以通过向它们添加0(例如)将字符串转换为数字类型(整数/浮点数).

print "36.5"+0
Run Code Online (Sandbox Code Playgroud)

然后你可以用它sprintfgprintf你正在做的格式化它.

没有任何float功能,这很奇怪.(int如果要转换为整数,则可以使用).

编辑

下面的脚本为我工作(当我将您的示例数据粘贴到名为"datafile"的文件中时):

K = "`head -1 datafile | awk '{print $6}'`"
K=K+0  #Cast K to a floating point number
graph(n) = sprintf("K=%.2e",n)
plot "datafile" using 1:3 title graph(K)
Run Code Online (Sandbox Code Playgroud)

编辑2(地址评论如下)

要在backtics中扩展变量,您需要使用宏:

set macro
file="mydatafile.txt"
#THE ORDER OF QUOTES (' and ") IS CRUCIAL HERE.
cmd='"`head -1 ' . file . ' | awk ''{print $6}''`"'
# . is string concatenation.  (this string has 3 pieces)
# to get a single quote inside a single quoted string
#   you need to double.  e.g. 'a''b' yields the string a'b 
data=@cmd
Run Code Online (Sandbox Code Playgroud)

为了解决你的问题2,熟悉shell实用程序是个好主意 - sed和awk都可以做到.我将展示头/尾的组合:

cmd='"`head -2 ' . file . ' | tail -1 | awk ''{print $6}''`"'
Run Code Online (Sandbox Code Playgroud)

应该管用.

编辑3

我最近了解到,在gnuplot中,它既system是一个函数,也是一个命令.要做到以上没有所有的辩论体操,

data=system("head -1 " . file . " | awk '{print $6}'")
Run Code Online (Sandbox Code Playgroud)

哇,好多了.


KDN*_*KDN 5

这是一个非常老的问题,但是这是一种获取数据文件中任何位置的单个值并将其另存为gnuplot可访问变量的好方法:

set term unknown #This terminal will not attempt to plot anything
plot 'myfile.dat' index 0 every 1:1:0:0:0:0 u (var=$1):1
Run Code Online (Sandbox Code Playgroud)

index数字使您可以寻址一个特定的数据集(由两个回车分隔),而every您可以指定一个特定的行。

之后的以冒号分隔的数字every应采用以下格式:1:1:<line_number>:<block_number>:<line_number>:<block_number>行号是与代码块所在的行(从0开始),代码块号是区块的编号(由单回车分隔,从0)。第一个和第二个数字说每1行和每个数据块绘制一次,第三个和第四个数字说从line <line_number>和block 开始<block_number>。第五和第六说停在哪里。这使您可以在数据文件中的任何位置选择一行。

plot命令的最后一部分将特定列(在本例中为第1列)中的值分配给变量(var)。plot命令需要有两个值,因此我选择了第1列以针对变量赋值语句进行绘制。