【问题标题】:awk counting average for each minute in file文件中每分钟的 awk 计数平均值
【发布时间】:2014-06-12 04:57:57
【问题描述】:

假设我有一个这样的文件:

13.03.2013 12:13:01|STRING1|NUMBER1|1|NUMBER3
13.03.2013 12:13:08|STRING1|NUMBER1|12|NUMBER3
13.03.2013 12:13:09|STRING3|NUMBER1|13|NUMBER3
13.03.2013 12:13:12|STRING2|NUMBER1|21|NUMBER3
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|NUMBER3
13.03.2013 12:13:25|STRING3|NUMBER1|51|NUMBER3
13.03.2013 12:13:38|STRING2|NUMBER1|71|NUMBER3
13.03.2013 12:13:40|STRING1|NUMBER1|21|NUMBER3
13.03.2013 12:13:42|STRING1|NUMBER1|11|NUMBER3
13.03.2013 12:13:55|STRING3|NUMBER1|71|NUMBER3
13.03.2013 12:14:02|STRING1|NUMBER1|11|NUMBER3
13.03.2013 12:14:07|STRING1|NUMBER1|13|NUMBER3
13.03.2013 12:14:08|STRING3|NUMBER1|13|NUMBER3
13.03.2013 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|NUMBER3
13.03.2013 12:14:45|STRING1|NUMBER1|11|NUMBER3
13.03.2013 12:14:58|STRING3|NUMBER1|51|NUMBER3
13.03.2013 12:15:06|STRING2|NUMBER1|11|NUMBER3
13.03.2013 12:15:13|STRING1|NUMBER1|43|NUMBER3
13.03.2013 12:15:22|STRING2|NUMBER1|21|NUMBER3
13.03.2013 12:15:26|STRING3|NUMBER1|51|NUMBER3
13.03.2013 12:15:35|STRING2|NUMBER1|71|NUMBER3
13.03.2013 12:15:40|STRING1|NUMBER1|1|NUMBER3
13.03.2013 12:15:42|STRING1|NUMBER1|21|NUMBER3
13.03.2013 12:15:53|STRING3|NUMBER1|71|NUMBER3

我想只为变量X 找到每分钟第 4 列(第三个 | 之后)的平均值。例如,如果$X="STRING1" 结果应该是:

13.03.2013 12:13|STRING1|11.6
13.03.2013 12:14|STRING1|7.4
13.03.2013 12:15|STRING1|21.666

因此,我们每分钟查看带有变量$X 的行并计算这些行的平均值。如何处理?

【问题讨论】:

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

标签: regex bash awk sed mean


【解决方案1】:

您可以使用以下 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

【讨论】:

  • 不保证输出顺序。可能需要按时间列排序
  • 在我的解决方案中顺序无关紧要
  • 但这可能对 OP 很重要
  • 你的意思是输出中的行顺序?输入中的行可能按时间排序,因为它是一个日志文件。有了这个,输出也将被排序(零努力)。我错过了什么吗?
  • 您是:在 END 块中,您正在迭代关联数组的索引。在那个循环中没有固有顺序你不是:我错过了你的数组索引是整数的事实。没关系。
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    相关资源
    最近更新 更多