gnuplot store one number from data file into variable

gnuplot, variables

Solution

You have a few options...

FIRST OPTION:

use `columnheader`

plot file using 1:3 title columnheader(6)

I haven't tested it, but this may prevent the first row from actually being plotted.

SECOND OPTION:

use an external utility to get the title:

TITLE="`head -1 datafile | awk '{print $6}'`"
plot 'datafile' using 1:3 title TITLE

If the variable is numeric, and you want to reformat it, in gnuplot, you can cast strings to a numeric type (integer/float) by adding 0 to them (e.g).

print "36.5"+0

Then you can format it with `sprintf` or `gprintf` as you're already doing.

It's weird that there is no `float` function. (`int` will work if you want to cast to an integer).

EDIT

The script below worked for me (when I pasted your example data into a file called "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)

EDIT 2 (addresses comments below)

To expand a variable in backtics, you'll need macros:

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

To address your question 2, it is a good idea to familiarize yourself with shell utilities -- sed and awk can both do it. I'll show a combination of head/tail:

cmd='"`head -2 ' . file . ' | tail -1 | awk ''{print $6}''`"'

should work.

EDIT 3

I recently learned that in gnuplot, `system` is a function as well as a command. To do the above without all the backtic gymnastics,

data=system("head -1 " . file . " | awk '{print $6}'")

Wow, much better.

Problem

OSX v10.6.8 and Gnuplot v4.4 I have a data file with 8 columns. I would like to take the first value from the 6th column and make it the title. Here's what I have so far: ``` #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) ``` And here is what the first few rows of my data file looks like: ``` 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 ``` I don't know how to correctly read in the data or if this is even the right way to go about this. EDIT #1 Ok, thanks to mgilson I now have ``` #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) ``` but I get the error: Non-numeric string found where a numeric expression was expected EDIT #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) ``` This gives the error--> head: file: No such file or directory "testPlot.gnu", line 9: Non-numeric string found where a numeric expression was expected

Original source