【问题标题】:Find max number of concurrent events查找最大并发事件数
【发布时间】:2010-11-17 08:31:46
【问题描述】:

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

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

为此,我愿意

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

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

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

我的 awk 充其量只是初级,我在实施第 2 步时遇到了困难。 我希望这是一个纯粹的脚本,而不需要使用像 java 这样的重量级语言。 因此,来自 awk 大师的任何帮助将不胜感激。也欢迎任何非 awk linux one 衬里。

【问题讨论】:

  • 我已经更新了问题。 “当前值”是当前正在处理的行的结束时间
  • 记得接受更适合您问题的答案(如果有的话),如果您认为值得,最终投票。

标签: bash awk


【解决方案1】:
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 }

【讨论】:

  • gawk 抱怨没有必要转义逗号。第二个输出行应该是 1(测试应该是 &lt;= 而不是 &lt;)。 ideone
  • @Dennis 转义逗号是为了适应。测试按要求进行在此事件之前大于当前值
  • 添加我自己的 bash 实现作为记录,它更暴力,当然不能转换为单行... end_times= start_times= geqs= i=0 while read line ;对 "${end_times[@]}" 中的 end_time 执行 start_times[$i]=echo $line | awk -F, '{print $1}' end_times[$i]=echo $line | awk -F, '{print $2}' geq=0;如果 [ $((end_time)) -ge $((end_times[$i])) ];然后让 geq=$((geq + 1)) fi done geqs[$i]=$geq let i=$((i + 1)) done for (( c=0; c
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 2021-01-04
  • 1970-01-01
相关资源
最近更新 更多