写给自己的总结(对大家没有帮助)
1. kaldi实验,获得exp下所有实验训练时迭代l的所有log文件的帧准确率等,并且记录实验的名字等,成为所需的格式。
#!/bin/bash
exp=mfcc_exp_mono/exp
first=lstm_s12
first="d3cec1024r800tg0sp0_5_1lr0.001hf0.3"
for x in $exp/*${first}* ; do
if [ -d $x ] ;then
echo dir: $x
for decode in $x/log/iter*.log ; do
if [ -f $decode ] ;then
echo file: $decode
avgloss=$(cat $decode | grep "AvgLoss:" | tail -n 1 | awk '{ print $4; }')
frame_acc=$(cat $decode | grep "FRAME_ACCURACY" | tail -n 1 | awk '{ print $3; }')
echo "AvgLoss: "$avgloss
echo "FRAME_ACCURACY: "$frame_acc
echo
fi
done
echo
fi
done
2.将上面处理过的文件,转成能够直接使用jqplot的格式(最后只需要复制过去就行)
起初代码想了很久,能处理多个文件,内容设计中文的支持,DIR的使用,文件的读写(有很多小技巧,当时是过年在家写的)。 后来改为只处理一个文件,简洁,同时临时定义了一个函数,大大简化了程序
# -*- coding:utf-8 -*-
#ARGV其实是可以接受命令行变量的,但是必须要这样 ruby -w xxx.rb ... -w 可以不加
#__FILE__ 中文目录下,这个根本不行 #filename=File.expand_path(filename,__FILE__)
#filename="../experiments/*.txt"
#Dir[filename].each do |fname|
#exepath.force_encoding("UTF-8")
filenames=["a.txt"] #多个文件就放在数组里面
resultfile="my_result.txt"
rsfile_=File.open(resultfile,"w+")
cnt=10 #div id的起始
filenames.each do |fname|
#puts file 文件名
# 带有block后打开就不用关闭了
rsfile_.puts "------"+fname
File.open(fname.force_encoding("UTF-8"),"r") do |file|
cont_dir=""
cont_FRAME_ACCURACY=[[],[]]
tr_cv=0
#想了很久终于解决了我想解决的问题,就是连变量都可以共享 一般的def是不行的
define_method :puts_to_file_code do
if cont_FRAME_ACCURACY[0].length!=0
rsfile_.puts "---"+cont_dir #把目录名输入
#-----------专门针对jqplot的--------------#
cnt+=1
rsfile_.puts "<div id=\"chart#{cnt}\" class=\"lx_chart\" ></div>"
rsfile_.puts "<script>"
rsfile_.puts "drawchart(\"chart#{cnt}\",["
tmpdata=" ["
cont_FRAME_ACCURACY[0].each {|frame|
tmpdata+=frame+","
}
tmpdata+="],"
rsfile_.puts tmpdata
tmpdata=" ["
cont_FRAME_ACCURACY[1].each {|frame|
tmpdata+=frame+","
}
tmpdata+="],"
rsfile_.puts tmpdata
rsfile_.puts "],["
rsfile_.puts " {label:'tr:#{cont_dir}'},"
rsfile_.puts " {label:'cv:#{cont_dir}'},"
rsfile_.puts "])"
rsfile_.puts "</script>"
rsfile_.puts
end
end
while line=file.gets
next if line.strip=="" #去除回车后
#puts line
#puts line=~/dir/
if line=~/^dir:.*\/(.*)$/
puts_to_file_code
cont_dir=$1
cont_FRAME_ACCURACY=[[],[]]
elsif line=~/^file:.*initial\.log/
tr_cv=100
elsif line=~/^file:.*tr\./
tr_cv=0
elsif line=~/^file:.*cv\./
tr_cv=1
elsif line=~/^FRAME_ACCURACY:\s*(\d+\.?\d*)%$/
next if tr_cv>2
#puts $1
cont_FRAME_ACCURACY[tr_cv].push $1
end
end
puts_to_file_code
end
end
rsfile_.close
3. 处理wer得到自己关注的内容
这里用到 文件读写,字符串分割,及接受程序传参等
argv=ARGV
fin,fout="in.txt","out.txt"
if argv.length==2
fin,fout=argv[0],argv[1]
elsif argv.length==1
fin=argv[0]
end
#p fin,fout
fpin,fpout=File.open(fin,"r"),File.open(fout,"w+");
while line=fpin.gets
sz=line.split /\|/
fpout.print sz[0],sz[-1]
fpout.puts
end
fpin.close
fpout.close