2014-06-11 118 views
0

让假设我有一个这样的文件:AWK计数平均为在文件中的每个分钟

2013年3月13日12:13:01 | STRING1 | NUMBER1 | 1 | 3号
2013年3月13日12时13分:08 | STRING1 | NUMBER1 | 12 | 3号
2013年3月13日12:13:09 | STRING3 | NUMBER1 | 13 | 3号
2013年3月13日12:13:12 | STRING2 | NUMBER1 | 21 | 3号
13.03。 2013 12:13:15 | STRING2 | NUMBER1 | 11 | NUMBER3
13.03.2013 12:13:18 | STRING1 | NUMBER1 | 13 | NUMBER3
13.03.2013 12:13:20 | STRING2 | NUMBER1 | 21 | NU MBER3
2013年3月13日12:13:25 | STRING3 | NUMBER1 | 51 | 3号
2013年3月13日12:13:38 | STRING2 | NUMBER1 | 71 | 3号
2013年3月13日12:13:40 | STRING1 | NUMBER1 | 21 | 3号
2013年3月13日12:13:42 | STRING1 | NUMBER1 | 11 | 3号
2013年3月13日12:13:55 | STRING3 | NUMBER1 | 71 | 3号
2013年3月13日12:14: 02 | STRING1 | NUMBER1 | 11 | 3号
2013年3月13日12:14:07 | STRING1 | NUMBER1 | 13 | 3号
2013年3月13日12:14:08 | STRING3 | NUMBER1 | 13 | 3号
2013年3月13日12:14:15 | STRING2 | NUMBER1 | 21 | NUMBER3
13.03.2013 12:14:16 | STRING2 | NUMBER1 | 11 | NUMBER3
13.03.2013 12:14:16 | STRING1 | NUMBER1 | 1 | NUMBER3
13.03.2013 12:14:20 | STRING2 | NUMBER1 | 21 | NUMBER3
13.03.2013 12:14:25 | STRING3 | NUMBER1 | 51 | NUMBER3
13.03.2013 12:14:37 | STRING2 | NUMBER1 | 71 | NUMBER3
13.03.2013 12:14:42 | STRING1 | NUMBER1 | 1 | 3号
2013年3月13日12:14:45 | STRING1 | NUMBER1 | 11 | 3号
2013年3月13日12:14:58 | STRING3 | NUMBER1 | 51 | 3号
2013年3月13日12:15:06 | STRING2 | NUMBER1 | 11 | NUMBER3
13.03.2013 12:15:13 | STRING1 | NUMBER1 | 43 | NUMBER3
2013年3月13日12:15:22 | STRING2 | NUMBER1 | 21 | 3号
2013年3月13日12:15:26 | STRING3 | NUMBER1 | 51 | 3号
2013年3月13日12:15:35 | STRING2 | NUMBER1 | 71 | 3号
2013年3月13日12:15:40 | STRING1 | NUMBER1 | 1 | 3号
2013年3月13日12:15:42 | STRING1 | NUMBER1 | 21 | 3号
2013年3月13日12:15:53 | STRING3 | NUMBER1 | 71 | 3号

我想找个平均为每分钟仅可变X列4号(后第三|)。例如,如果$X="STRING1"结果应该是:

2013年3月13日12:13 | STRING1 | 11.6
2013年3月13日12:14 | STRING1 | 7.4
2013年3月13日12:15 | STRING1 | 21.666

因此,我们在每个分钟行中查找变量$X并计算这些行的平均值。如何处理它?

+0

这是一个家庭作业? –

+0

不,我正在编写脚本来分析来自一个应用程序的日志。这是其中一个步骤..我卡在这里。 – user109447

回答

2

您可以使用以下awk程序:

example.awk

$0 ~ SEARCH { 
    split($1,time,":") 
    min=time[2] 
    total[min]+=$4 
    count[min]++ 
    ts[min]=time[1]":"time[2] 
} 

END{ 
    for(m in total){ 
    printf "%s|%s|%s\n", ts[m],SEARCH,total[m]/count[m] 
    } 
} 

执行:

awk -F'|' -v SEARCH=STRING1 -f example.awk your.log 

输出:

13.03.2013 12:13|STRING1|11.6 
13.03.2013 12:14|STRING1|7.4 
13.03.2013 12:15|STRING1|21.6667 
+0

输出的顺序不能保证。可能需要排序的时间列 –

+0

的顺序在我的解决方案 – hek2mgl

+0

并不重要,但它可能之至 –

2
awk -v X="STRING1" ' 
    BEGIN { FS = OFS = "|" } 
    $2 != X {next} 
    {min = substr($1,1,16)} 
    min != prev { 
     if (NR>1) print prev, X, total/n 
     total = n = 0 
     prev = min 
    } 
    {n++; total += $4} 
    END {print prev, X, total/n} 
' file