Chinaunix

标题: 请问怎么统计出每个小时段的最大响应时间和最小响应时间 [打印本页]

作者: qjpoo    时间: 2016-08-25 22:17
标题: 请问怎么统计出每个小时段的最大响应时间和最小响应时间
文本如下
[root@centos ~]# cat 1
时间                                        ip                响应时间
[2016-08-23  19:20:30]   192.168.1.8  0.11
[2016-08-23  19:20:35]   192.168.1.8  0.12
[2016-08-23  19:22:39]   192.168.1.8  0.15
[2016-08-23  19:30:30]   192.168.1.8  0.21
[2016-08-23  20:20:40]   192.168.1.8  0.11
[2016-08-23  20:22:50]   192.168.1.8  0.12
[2016-08-23  20:24:30]   192.168.1.8  0.22
[2016-08-23  20:44:30]   192.168.1.8  0.12

需求:请问怎么统计出每个小时段的最大响应时间和最小响应时间

所要的结果如下:

[2016-08-23  19:20:30]   192.168.1.8  0.11
[2016-08-23  19:30:30]   192.168.1.8  0.21
[2016-08-23  20:20:40]   192.168.1.8  0.11
[2016-08-23  20:24:30]   192.168.1.8  0.22

作者: qjpoo    时间: 2016-08-25 22:20
写的越简单,越精华最好,请用awk来展现,谢谢
作者: wh7211    时间: 2016-08-25 23:13
本帖最后由 wh7211 于 2016-08-26 13:55 编辑
  1. awk -F"[[ :]+" 'function s(){min[$2"_"$3]=max[$2"_"$3]=$NF;min1[$2"_"$3]=max1[$2"_"$3]=$0};function t(){if($NF<min[$2"_"$3]){min[$2"_"$3]=$NF;min1[$2"_"$3]=$0}else if($NF>max[$2"_"$3]){max[$2"_"$3]=$NF;max1[$2"_"$3]=$0}};NR>1&&min[$2"_"$3]{t()}NR>1&&!min[$2"_"$3]{s();t()}END{for(i in min1){print min1[i]"\n"max1[i]}}' file
复制代码

作者: zxy877298415    时间: 2016-08-25 23:31
  1. awk '{t=$1"  "$2;a[$2+0]=1;b[t]=$NF;d[t]=$(NF-1)}END{for(i in a) {for(j in b) {split(j,c," +");if(c[2]+0==i) {if(!min&&!max) {max=min=b[j];max1=min=j} if (max<b[j]) {max=b[j];max1=j} if (min>b[j]) {min=b[j];min1=j}}}print min1"   "d[min1]"  "min"\n"max1"   "d[max1]"  "max;min=max=0}}' file
复制代码
回复 1# qjpoo



作者: zerostudy    时间: 2016-08-26 00:27
  1. awk -F"[[ :]+" 'NR>1{s=$2$3;a[s,$NF]=$0;if(b[s]<$NF){b[s]=$NF};if(!c[s]){c[s]=$NF}else{if(c[s]>$NF){c[s]=$NF}}}END{for(x in b){print a[x,b[x]]"\n"a[x,c[x]]}}' 1
复制代码

作者: elu_ligao    时间: 2016-08-26 10:44
  1. awk '!a[$1,+$2]++{s=$1""+$2;max[s]=min[s]=$NF;mx[s]=mn[s]=$0;next}{if(max[s]<$NF){max[s]=$NF;mx[s]=$0}else if(min[s]>$NF){min[s]=$NF;mn[s]}}END{l=asorti(max,smax);for(i=1;i<=l;++i)print mn[smax[i]]"\n"mx[smax[i]]}'
复制代码

作者: nomethod    时间: 2016-08-26 11:27
  1. sort -k2.1,2.3n -k4n file | awk 'END{print b}+$2!=a&&a{print b"\n"$0}{a=+$2;b=$0}NR==1'
  2. [2016-08-23  19:20:30]   192.168.1.8  0.11
  3. [2016-08-23  19:30:30]   192.168.1.8  0.21
  4. [2016-08-23  20:20:40]   192.168.1.8  0.11
  5. [2016-08-23  20:24:30]   192.168.1.8  0.22
复制代码

作者: LikeLx    时间: 2016-08-26 11:28
  1. awk -F '[: ]+' '{e=$1 $2 $5}$NF>a[e]{a[e]=$NF;b[e]=$0}!c[e]||c[e]>$NF{c[e]=$NF;d[e]=$0}END{for(n in a)print b[n]"\n"d[n]}'
复制代码

作者: moperyblue    时间: 2016-08-26 15:08
  1. sort -k1,1n -k2,2n -k4,4n|sed -r '1N;:a;N;/^([^:]*:).*\n\1[^\n]*$/{s/\n[^\n]*//;ta};P;D'
复制代码

作者: reb00t    时间: 2016-08-26 18:07
  1. def get_content(fname):
  2.     with open(fname) as fs:
  3.         return fs.read().strip().split('\n')


  4. def get_max_min(content):


  5.     data = {}
  6.     for line in content:
  7.         l = line.split()
  8.         key =  l[0][1:] + ' ' + l[1].split(':')[0]
  9.         if key in data:
  10.             data[key].append(l[3])
  11.         else:
  12.             data[key] = [l[3]]

  13.     return data

  14. def main():
  15.     fname = '1'
  16.     content = get_content(fname)
  17.     for k, v  in  get_max_min(content).items():
  18.         min_num = min(v)
  19.         max_num = max(v)
  20.         for line in content:
  21.             l = line.split()
  22.             key =  l[0][1:] + ' ' + l[1].split(':')[0]
  23.             if key == k  and  (l[3] == min_num or l[3]== max_num):
  24.                 print line


  25. if __name__ == '__main__':
  26.     main()

  27. 结果
  28. [2016-08-23  19:20:30]   192.168.1.8  0.11
  29. [2016-08-23  19:30:30]   192.168.1.8  0.21
  30. [2016-08-23  20:20:40]   192.168.1.8  0.11
  31. [2016-08-23  20:24:30]   192.168.1.8  0.22
复制代码

作者: qjpoo    时间: 2016-08-27 00:56
谢谢大家




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2