查找最大并发事件数

时间:2010-11-16 08:35:12

标签: bash awk

我想以“hhmm”格式打印每个事件的开始时间和结束时间的最大并发事件数量(下面的示例输入)

$ cat input.txt  
1030,1100 
1032,1100
1032,1033 
1033,1050 
1034,1054
1039,1043 
1040,1300

为此,我会

  • 按开始时间排序(第1列)
  • 使用awk / sed迭代第2列中的所有值(即结束时间),以查找此事件之前的结束时间的计数,该计数大于当前值(即查找全部 目前正在举办活动)。详细说明,假设第3行正在由awk处理......它的结束时间是10:33。前两个活动的结束时间是11:00和11:00。 由于这两个值都大于10:33(即它们仍在10:33运行),因此第三列(即并发作业数)将包含2行

用于查找此输入的并发事件的awk脚本的预期输出将是

0
1
2
2
2
4
0 
  • 找到第三列的最大值。

我的awk充其量只是初步的,我在执行第2步时遇到了困难。 我希望这是一个纯粹的脚本,而不是像Java一样使用重量级的语言。 因此,awk大师的任何帮助都将受到高度赞赏。任何非awk linux one line也是最受欢迎的。

1 个答案:

答案 0 :(得分:0)

BEGIN  {FS="\,"; i=0}

{ superpos=0;
    for (j=1; j<=i; j++ ){
      if($2 < a[j,2])
          ++superpos
     }
      a[++i,1]=$1;
      a[i,2]=$2;
      print superpos;
      a[i,3]=superpos;
}
END{ max=0; 
        for (j=1; j<=i; j++ ){ 
          if ( a[j,3]>max)
            max= a[j,3];
     }
     print "max = ",max;
 }

ideone

运行

HTH!

输出:

0
0
2
2
2
4
0
max =  4

修改

或者更糟糕,如果你愿意的话:

BEGIN  {FS="\,"; max=0 }
{ 
    b=0; 
    for (var in a){
      if($2 < a[var]) b++;
    }  
      a[NR]=$2;
      print b;
      if (b > max) max = b;
}
END { print "max = ", max }