2012-06-26 25 views
9

OSX v10.6.8 và Gnuplot v4.4gnuplot lưu trữ một số từ tệp dữ liệu vào biến

Tôi có tệp dữ liệu với 8 cột. Tôi muốn lấy giá trị đầu tiên từ cột thứ 6 và biến nó thành tiêu đề. Dưới đây là những gì tôi có cho đến nay:

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

Và đây là những gì mà vài dòng đầu tiên của file dữ liệu của tôi trông giống như:

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 

Tôi không biết làm thế nào để đọc một cách chính xác trong các dữ liệu hoặc nếu điều này thậm chí là đúng cách để đi về điều này.

EDIT # 1

Ok, nhờ mgilson tôi bây giờ có

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

nhưng tôi nhận được lỗi: string Non-số tìm thấy nơi một số biểu hiện đã được dự kiến ​​

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) 

này cung cấp cho các lỗi -> đầu: file: Không có tập tin hoặc thư mục "testPlot.gnu", dòng 9: string Non-số tìm thấy nơi một số biểu hiện đã được dự kiến ​​

Trả lời

11

Bạn có một vài lựa chọn .. .

FIRST OPTION:

sử dụng columnheader

plot file using 1:3 title columnheader(6) 

tôi đã không kiểm tra nó, nhưng điều này có thể ngăn chặn hàng đầu tiên từ thực sự được vẽ.

THỨ HAI OPTION:

sử dụng một tiện ích bên ngoài để có được danh hiệu:

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

Nếu biến là số, và bạn muốn định dạng lại nó, trong gnuplot, bạn có thể cast dây để một kiểu số (số nguyên/float) bằng cách thêm 0 vào chúng (ví dụ).

print "36.5"+0 

Sau đó, bạn có thể định dạng nó với sprintf hoặc gprintf như bạn đã làm.

Thật lạ khi không có hàm float. (int sẽ hoạt động nếu bạn muốn truyền tới số nguyên).

EDIT

Kịch bản dưới đây làm việc cho tôi (khi tôi dán dữ liệu ví dụ của bạn vào một tập tin gọi là "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 (địa chỉ bình luận dưới đây)

Để mở rộng biến số trong backtics, bạn sẽ cần macro:

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] 

Để giải quyết câu hỏi 2 của bạn, bạn nên tự làm quen với các tiện ích shell - sed và awk đều có thể làm điều đó. Tôi sẽ hiển thị kết hợp đầu/đuôi:

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

sẽ hoạt động.

EDIT 3

Gần đây tôi đã học được rằng trong gnuplot, system là một chức năng cũng như một lệnh. Để thực hiện những điều trên mà không cần đến tất cả các môn thể dục thẩm mỹ,

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

Wow, tốt hơn nhiều.

+0

Cảm ơn bạn rất nhiều! Tôi đã thử phương pháp columnheader nhưng như bạn nói nó ngăn chặn hàng đầu tiên từ âm mưu.Tôi hiện đang làm việc trên phương pháp thứ hai mà bạn đã đề cập và tôi nghĩ rằng tôi có thể làm cho nó hoạt động nhưng tôi nghĩ rằng tôi đang bối rối về làm thế nào để đúc chuỗi thành một kiểu số. Tôi đã thêm ở trên những gì tôi đã thay đổi. – whatsherface

+0

@whatsherface - Bạn đang sử dụng dấu nháy kép '" 'nơi bạn nên sử dụng dấu phẩy (nằm ở cùng một nút như ~ trên bàn phím người Mỹ) – mgilson

+0

Và khi kiểm tra thêm - tôi nhận thấy rằng tôi đã bỏ lỡ báo giá kép ... – mgilson

4

Đây là một câu hỏi rất cũ, nhưng đây là một cách tốt đẹp để có được quyền truy cập vào một giá trị duy nhất bất cứ nơi nào trong tập tin dữ liệu của bạn và lưu nó như là một biến gnuplot có thể truy cập:

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 

Số index cho phép bạn để giải quyết một tập dữ liệu cụ thể (được phân tách bằng hai dấu xuống dòng), trong khi every cho phép bạn chỉ định một dòng cụ thể.

Các số được phân cách bằng dấu hai chấm sau every phải ở dạng 1:1:<line_number>:<block_number>:<line_number>:<block_number>, trong đó số dòng là dòng có khối (bắt đầu từ 0) và số khối là số của khối (được phân tách bằng một vận chuyển trở lại, một lần nữa bắt đầu từ 0). Các số đầu tiên và số thứ hai cho biết âm mưu mỗi 1 dòng và mỗi khối dữ liệu, và thứ ba và thứ tư nói bắt đầu từ dòng <line_number> và chặn <block_number>. Thứ năm và thứ sáu nói nơi để dừng lại. Điều này cho phép bạn chọn một dòng duy nhất ở bất kỳ đâu trong tệp dữ liệu của bạn.

Phần cuối cùng của lệnh cốt truyện gán giá trị trong cột cụ thể (trong trường hợp này là cột 1) cho biến của bạn (var). Có cần phải có hai giá trị cho một lệnh cốt truyện, vì vậy tôi đã chọn cột 1 để vẽ với câu lệnh gán biến của tôi.

2

Đây là giải pháp ít 'awk'-ward giao giá trị từ hàng đầu tiên và cột thứ 6 của tệp' Data.txt 'cho biến x16.

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 

Một ví dụ tổng quát hơn để lưu trữ nhiều giá trị được đưa ra dưới đây:

# 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 
Các vấn đề liên quan