4

我在几个文件中有一系列测量。每个文件看起来像这样:

1 151.973938 144.745789 152.21991 17:57:14
2 151.995697 144.755737 152.21991 17:57:14
3 152.015747 144.765076 152.21991 17:57:14
.
.
.

我正在寻找一种可能性来计算多个文件中同一字段的平均值。在这个过程结束时,我想要一个平均测量值的图表。

gnuplot 可以吗?我自己无法在 gnuplot 中找到合适的选项。如果没有,您会推荐哪种不同的方式来实现这一目标?

最好的问候, Juuro

4

2 回答 2

4

你不能在 gnuplot 中做到这一切。Gnuplot 仅限于一次处理一个文件中的列。您需要一些其他实用程序来预处理您的数据。假设数据采用您演示的格式(使用空格而不是分号),此脚本将取第二、第三和第四列的平均值,并输出一个第一列和第五列相同的文件,中间取平均值。在只有.txt您要处理的文件的目录中运行此 bash 脚本。

#!/bin/bash

sum=$(ls -l *.txt | wc -l)
paste -d" " *.txt | nawk -v s="$sum" '{
    for(i=0;i<=s-1;i++)
    {
        t1 = 2+(i*5)
        temp1 = temp1 + $t1
        t2 = 3+(i*5)
        temp2 = temp2 + $t2
        t3 = 4+(i*5)
        temp3 = temp3 + $t3
    }
    print $1" "temp1/s" "temp2/s" "temp3/s" "$5
    temp1=0
    temp2=0
    temp3=0
}'

从 gnuplot 内部,您可以像这样运行脚本:

!myscript.sh > output.out
plot 'output.out' u 1:2 # orwhatever

或像这样:

plot '<myscript.sh' u 1:2

(代码灵感来自我在这里找到的内容。)

于 2012-05-30T15:03:24.830 回答
2

我认为gnuplot是不可能的。我会首先制作一个脚本来进行平均并将结果打印到标准输出。假设这个脚本叫做average.py:

plot '<average.py FILE1 FILE2 FILE3' w l

例如,脚本 average.py 可能看起来像这样。

#!/usr/bin/python
from numpy import loadtxt,mean,ones
import sys 

#number of files:
nrfiles=len(sys.argv[1:])

#just to get the dimensions of the files
data=loadtxt(str(sys.argv[1]))
rows=data.shape[0]
cols=data.shape[1]

#initialize array
all=ones((int(nrfiles),int(rows),int(10)))

#load all files:
n=0
for file in sys.argv[1:]:
      data=loadtxt(str(file))
      all[n,:,0:cols]=data
      n=n+1

#calculate mean:
mean_all=mean(all,axis=0)

#print to stdout
for i in range(rows):
      a=''
      for j in range(cols):
         a=a+str('%010.5f   ' % mean_all[i,j])
      print str(a)

此脚本的限制是所有文件必须具有相同的数据结构

于 2012-05-30T14:42:19.187 回答