2

我有一个数据文件:

######## Test at 123.45 start ########
######## File: abc.xyz ########
cores, pass_rate(actual), pass_rate(given)
1,7193,7210
2,10651,28840
4,10651,28840
8,10651,28840
######## End abc.xyz ########
######## File: def.xyz ########
cores, pass_rate(actual), pass_rate(given)
1,8619,8617
2,16567,16561
4,17256,66244
8,19874,66244
######## End def.xyz ########

我想绘制其中选择 abc.xyz 和 def.xyz 的第二列(即 pass_rate(actual) )的数据,并在绘图的帮助下全面比较它们。

在 cut 和 awk 命令的帮助下,我抓取了数据:

cat MYTEST_1.out | cut -d "," -f2 | awk '!/^#/'

这导致:

pass_rate(actual)
7193
10651
10651
10651
pass_rate(actual)
8619
16567
17256
19874

无法遇到抓取数据并绘制图表的脚本,即第一个 pass_rate 与 2nd pass_rate

4

2 回答 2

3

这是方法python

import sys
import matplotlib.pyplot as plt

p={}

with open(sys.argv[1]) as f:
    for line in f:
        if "File:" in line:
            key=line.split()[2]
            p[key]=[]
        if line[0].isdigit():
            x,y,z = line.strip().split(",")
            p[key].append([x,y])

for k,v in p.iteritems():    
    plt.plot(zip(*v)[0],zip(*v)[1],label=k)

plt.legend(loc='upper left')
plt.xlabel('cores')
plt.ylabel('pass rate (actual)')
plt.show()

将其保存plot.py并运行如下python plot.py data

在此处输入图像描述

于 2013-04-11T20:29:41.317 回答
2

为什么要连接数据?如果它在单独的文件中会更容易处理。

在 awk 的帮助下,您仍然可以使用这种格式。您可以结合 Gnuplot使用我在此处描述的提取技术。请注意,Gnuplot 将忽略以数字符号开头的行:

echo "
set key left
set datafile separator comma
plot for [i = 1:2] '< awk \"/^#{8} File:/ { f = 1; n++ } f && n == wanted; /^#{8} End/ { f = 0 }\" \
                    wanted='.i.' MYTEST_1.out' using 1:2 with lines title 'File '.i
" | gnuplot --persist

这将绘制文件的前两个部分。结果:

OPs 输入的前两个部分的图

编辑 - 更容易配置的替代方案

解析.awk

BEGIN {
  print "set datafile separator comma"
  print "set key left box"
  plot_str = "plot"
  col1     = 1
  col2     = 2
}

# In the first pass we determine number plots, plot titles and x/y labels
FNR == NR && /^#{8} File:/ {
  plot_str = plot_str " '-' using " col1 ":" col2 " with lines title '" $3 "', "
  if(!xylabels) {
    oFS=FS; FS=" *, *"
    getline
    print "set xlabel '" $col1 "'"
    print "set ylabel '" $col2 "'" 
    xylabels = 1
    FS=oFS
  }
} 

# Skip rest of script if this is the first pass
FNR == NR { next }

# The second pass starts here

# Only print 'plot_str' once
!f { print plot_str; f=1}

# If line starts with a number assume it is data
/^[0-9]/

# Terminate plot sequence
/^#{8} End/ {
  print "e"
}

像这样运行它:

awk -f parse.awk infile infile | gnuplot

具有正确键和标签的更好图

或者将第三列与第一列绘制:

awk -f parse.awk col2=3 infile infile | gnuplot

相同但绘制第三列

于 2013-04-11T19:47:33.860 回答