使用 awk 或其他 UNIX 实用程序在日志文件上移动平均值?

使用 awk 或其他 UNIX 实用程序在日志文件上移动平均值?

场景:
我有一个日志文件,其中有一些条目“类”,如下所示:

R0 dx=0.00500 rb=0.00000 sn=1 3145.88 2.59 0.08 se=21315 id=16190  
R0 dx=0.00300 rb=-1.00000 sn=1 3150.40 2.38 0.05 se=21316 id=16191  
R1 dx=-0.00500 rb=1.00000 sn=-1 3155.14 2.54 0.05 se=21317 id=16192  
R1 dx=-0.02000 rb=-1.00000 sn=-1 3157.73 2.48 0.10 se=21318 id=16193  
R0 dx=-0.02000 rb=0.00000 sn=-1 3160.59 2.74 0.08 se=21319 id=16194   
R1 dx=0.00500 rb=1.00000 sn=1 3165.18 2.43 0.10 se=21320 id=16195     
R0 dx=0.00100 rb=-1.00000 sn=1 3167.84 2.53 0.05 se=21321 id=16196    
R3 dx=0.00100 rb=1.00000 sn=1 3170.11 0.10 0.10 se=21322 id=16197     

我正在使用tail -F(有没有办法让 tail -F 发出蜂鸣声?

我的问题是:有没有办法计算“R1线数与R0线数”的滑动(移动)比例,举个例子?除了打印这个比率之外,我还需要能够将其传递给其他一些工具(例如 gnuplot)来绘制它(尽管这可能有点牵强)。

显然,在 Python、MATLAB 或 Octave 中这是一件相当微不足道的事情,但我非常渴望学习在 shell 中执行此操作,我认为棘手的部分是将值传递给绘图实用程序以更新绘图。

答案1

让 tail -F 每行发出一次蜂鸣声:

bel=`echo foo | tr -c -s '\007' '\007'`
tail -F file | sed "s/\$/$bel/"

至于使用 shell 计算移动平均值,这里有一个 bash 脚本,用于跟踪大小为 $windowsize 的移动窗口内 R0 和 R1 行的数量。跟踪变量是 r0sum 和 r1sum。

windowsize=10
declare -ai isr0line isr1line r0sum r1sum i
for ((i=0; $i<$windowsize;i+=1)) ; do isr0line[$i]=0; isr1line[$i]=0; done
i=0
while read line
do
   r0sum=$(($r0sum - ${isr0line[$i]}))
   r1sum=$(($r1sum - ${isr1line[$i]}))
   case "$line" in
      R0*) isr0line[$i]=1; isr1line[$i]=0; ;;
      R1*) isr1line[$i]=1; isr0line[$i]=0; ;;
        *) isr0line[$i]=0; isr1line[$i]=0; ;;
   esac
   r0sum=$(($r0sum + ${isr0line[$i]}))
   r1sum=$(($r1sum + ${isr1line[$i]}))
   echo "R0 lines $r0sum  R1 lines $r1sum"
   i=$((($i + 1) % $windowsize))
done

答案2

通过以下方式过滤您的日志:

awk '/^R1/ { r1++ } ; /^R0/ { r0++ } ; r0 > 0 {  print r1/r0 }'

这应该输出第一个 R0 之后每行的“运行比”。


这是滑动比率(抱歉,我对“比率”的含义有错误的理解):

BEGIN { winsize=10; h=t=r0=r1=0 }
/^R0/ { r0++ }
/^R1/ { r1++ }
      { print r1 ":" r0 ; buf[h++] = $1 }
h - t >= winsize { r = buf[t]; delete buf[t++] }                   
r ~ /R1/ { r1-- }
r ~ /R0/ { r0-- }

该变量winsize保存窗口大小。正则表达式在这里是多余的,但它们可以节省击键次数。测试可能是$1 == "R0"r == "R0"

相关内容