2012-10-11 24 views
16

Tôi muốn một cái gì đó như thế này:sử dụng awk hoặc lệnh shell khác bên trong chức năng gnuplot

file1='logs/last/mydata1.log' 
file2='logs/last/mydata2.log' 

# declare function that uses awk to reshape the data - does not work :(
sum1(fname)=("<awk '{sum=0; for(i=8;i<=NF;i+=2) sum+=$i; print $1,sum/2}' $fname") 
sum2(fname)=("<awk '{sum=0; for(i=9;i<=NF;i+=2) sum+=$i; print $1,sum/2}' $fname") 

# plot different columns of my file and awk processed file 
plot file1 u 1:2 title "thing A measure 1" w l, \ 
    file1 u 3:4 title "thing A measure 2" w l, \ 
    file2 u 1:2 title "thing B measure 1" w l, \ 
    file2 u 3:4 title "thing B measure 2" w l, \ 
    sum1(file1) u 1:2 title "group A measure 1" w l, \ 
    sum2(file1) u 1:2 title "group A measure 2" w l, \ 
    sum1(file2) u 1:2 title "group B measure 1" w l, \ 
    sum2(file2) u 1:2 title "group B measure 2" w l 

gì không được làm việc là phần với awk bên trong một hàm gnuplot. Sử dụng awk kịch bản của tôi trực tiếp sau khi plot hoạt động tốt:

plot "<awk '{sum=0; for(i=9;i<=NF;i+=2) sum+=$i; print $1,sum}' ./logs/last/mydata1.log" u 1:2 w l 

Có cách nào để đặt awk hoặc các lệnh shell khác bên trong một hàm gnuplot? Tôi biết tôi có thể thuê ngoài tập lệnh awk sang một tệp khác và awk tệp này trực tiếp sau plot, nhưng tôi không muốn các tệp riêng biệt.

Trả lời

23

$var không mở rộng var trong chuỗi trong gnuplot giống như trong vỏ. Bạn muốn sử dụng dây nối gnuplot của (trong đó sử dụng các nhà điều hành .):

sum1(fname)="<awk '{sum=0; for(i=8;i<=NF;i+=2) sum+=$i; print $1,sum/2}' ".fname 

Hoặc, tôi giả sử bạn có thể sử dụng sprintf nếu bạn thấy rằng thoải mái hơn:

sum1(fname)=sprintf("<awk '{sum=0; for(i=8;i<=NF;i+=2) sum+=$i; print $1,sum/2}' %s",fname) 

* Lưu ý rằng đây doesn' t thực sự thực hiện lệnh. Nó chỉ xây dựng chuỗi sẽ được chuyển đến plot và sau đó plot sẽ thực hiện lệnh. Nếu bạn thực sự muốn thực thi lệnh trong một hàm, bạn có thể gọi system làm chức năng. Từ tài liệu:

`system "command"` executes "command" using the standard shell. See `shell`. 
If called as a function, `system("command")` returns the resulting character 
stream from stdout as a string. One optional trailing newline is ignored. 

This can be used to import external functions into gnuplot scripts: 

     f(x) = real(system(sprintf("somecommand %f", x))) 
+1

Hoàn hảo! Bây giờ tôi cũng đã thêm một hàm trợ giúp khác 'exec (cmd, arg1) = (hệ thống (sprintf (cmd, arg1))) ' giúp tôi không phải gõ lại' hệ thống (sprintf()) 'nhiều lần – Juve

+0

Tôi chỉ thấy rằng 'exec' không hoạt động với' plot'. Như bạn đã nói, 'plot' mong đợi một chuỗi, như được tạo bởi đoạn mã thứ hai của bạn. Thx để chỉ ra điều đó. – Juve

Các vấn đề liên quan