2012-06-26 9 views
9

OSX v10.6.8 und Gnuplot v4.4gnuplot speichert eine Nummer aus der Datendatei in die Variable

Ich habe eine Datei mit 8 Spalten. Ich möchte den ersten Wert aus der 6. Spalte nehmen und ihn zum Titel machen. Hier ist, was ich bisher:

#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) 

Und hier ist es, was die ersten paar Zeilen meiner Daten-Datei wie folgt aussehen:

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 

Ich weiß nicht, wie man richtig in den Daten zu lesen oder wenn Das ist sogar der richtige Weg.

EDIT # 1

Ok, danke ich mgilson jetzt haben

#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) 

aber ich habe den Fehler: Nicht-numerische Zeichenfolge gefunden, wo ein numerischer Ausdruck erwartet wurde

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) 

Dies gibt den Fehler -> Kopf: file: Keine solche Datei oder das Verzeichnis „testPlot.gnu“, Zeile 9: Nicht-numerische Zeichenfolge gefunden, wo ein numerischer Ausdruck

Antwort

11

Sie haben ein paar Optionen zu erwarten war .. .

erste Option:

Verwendung columnheader

plot file using 1:3 title columnheader(6) 

ich es nicht getestet haben, aber dies die erste Zeile verhindern von tatsächlich geplottet werden.

ZWEITE OPTION:

ein externes Dienstprogramm verwenden, um die Titel zu erhalten:

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

Wenn die Variable numerisch ist, und Sie wollen es neu zu formatieren, in gnuplot, können Sie Strings zu gieße ein numerischer Typ (Ganzzahl/Gleitkommazahl) durch Hinzufügen von 0 zu ihnen (z. B.).

print "36.5"+0 

Dann können Sie es formatieren mit sprintf oder gprintf wie Sie bereits tun.

Es ist seltsam, dass es keine float Funktion. (int funktioniert, wenn Sie in eine Ganzzahl umwandeln möchten).

EDIT

Das Skript unten für mich gearbeitet (wenn ich Ihre Beispieldaten in einer Datei namens "Datendatei" eingefügt):

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 (Adressen Kommentare unten)

Um eine Variable in Backtics zu erweitern, benötigen Sie Makros:

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 
[email protected] 

Um Ihre Frage 2 anzugehen, ist es eine gute Idee, sich mit Shell-Utilities vertraut zu machen - sed und awk können beides tun. Ich werde eine Kombination von Kopf/Schwanz zeigen:

sollte funktionieren.

EDIT 3

ich vor kurzem erfahren, dass in gnuplot, system eine Funktion sowie ein Befehl ist. Zu tun, um die oben ohne alle backtic Gymnastik,

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

Wow, viel besser.

+0

Vielen Dank! Ich habe die columnheader-Methode ausprobiert, aber wie du gesagt hast, verhindert das, dass die erste Zeile gezeichnet wird.Ich arbeite jetzt an der zweiten Methode, die Sie erwähnt haben, und ich denke, ich kann es zur Arbeit bringen, aber ich denke, ich bin verwirrt darüber, wie die Zeichenfolge auf einen numerischen Typ umgewandelt wird. Ich habe oben hinzugefügt, was ich geändert habe. – whatsherface

+0

@whatsherface - Sie verwenden ein Doppelzitat '' ', wo Sie eine Backtic verwenden sollten (befindet sich auf der gleichen Schaltfläche wie ~ auf einer amerikanischen Tastatur) – mgilson

+0

Und bei weiterer Inspektion - ich bemerkte, dass ich meine vermisste doppelte Anführungszeichen ... – mgilson

4

Dies ist eine sehr alte Frage, aber hier ist eine schöne Möglichkeit, Zugriff auf einen einzelnen Wert in der Datendatei überall zu bekommen und als gnuplot zugänglichen Variablen speichern:

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 

Die index Nummer ermöglicht es Ihnen um einen bestimmten Datensatz zu adressieren (getrennt durch zwei Zeilenumbrüche), während every Ihnen erlaubt, eine bestimmte Zeile anzugeben.

Die Doppelpunkt-getrennten Nummern nach every sollten das Format 1:1:<line_number>:<block_number>:<line_number>:<block_number> haben, wobei die Zeilennummer die Zeile mit dem Block ist (beginnend mit 0) und die Blocknummer die Nummer des Blocks ist (getrennt durch einen einzelnen) Wagenrücklauf, wieder ab 0). Die erste und die zweite Zahl geben an, dass alle 1 Zeilen und jeder einzelne Datenblock aufgezeichnet wird, und der dritte und der vierte Wert beginnen an der Zeile <line_number> und dem Block <block_number>. Der fünfte und der sechste sagen, wo man aufhören soll. Dadurch können Sie eine einzelne Zeile in Ihrer Datendatei auswählen.

Der letzte Teil des Plot-Befehls weist Ihrer Variablen (var) den Wert in einer bestimmten Spalte (in diesem Fall Spalte 1) zu. Da für einen Plot-Befehl zwei Werte benötigt werden, habe ich die Spalte 1 gewählt, um sie mit meiner Variablenzuweisungsanweisung zu plotten.

2

Hier ist eine weniger peinliche Lösung, die der Variablen x16 den Wert aus der ersten Zeile und der sechsten Spalte der Datei 'Data.txt' zuweist.

set table 
# Syntax: u 0:($0==RowIndex?(VariableName=$ColumnIndex):$ColumnIndex) 
# RowIndex starts with 0, ColumnIndex starts with 1 
# 'u' is an abbreviation for the 'using' modifier 
plot 'Data.txt' u 0:($0==0?(x16=$6):$6) 
unset table 

Ein allgemeineres Beispiel mehrere Werte für die Speicherung ist unten angegeben:

# Load data from file to variable 
# Gnuplot can only access the data via the "plot" command 
set table 
# Syntax: u 0:($0==RowIndex?(VariableName=$ColumnIndex):$ColumnIndex) 
# RowIndex starts with 0, ColumnIndex starts with 1 
# 'u' is an abbreviation for the 'using' modifier 
# Example: Assign all values according to: xij = Data33[i,j]; i,j = 1,2,3 
plot 'Data33.txt' u 0:($0==0?(x11=$1):$1),\ 
       '' u 0:($0==0?(x12=$2):$2),\ 
       '' u 0:($0==0?(x13=$3):$3),\ 
       '' u 0:($0==1?(x21=$1):$1),\ 
       '' u 0:($0==1?(x22=$2):$2),\ 
       '' u 0:($0==1?(x23=$3):$3),\ 
       '' u 0:($0==2?(x31=$1):$1),\ 
       '' u 0:($0==2?(x32=$2):$2),\ 
       '' u 0:($0==2?(x33=$3):$3) 
unset table 
print x11, x12, x13  # Data from first row 
print x21, x22, x23  # Data from second row 
print x31, x32, x33  # Data from third row 
Verwandte Themen