2010-11-16 42 views
1

的最大数量,我想打印给每个事件的开始时间和结束时间在“HHMM”格式并发事件的最大数量(例如下面输入)查找并发事件

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

对于本,我会

  • 排序开始时间(第1列)
  • 用awk/sed的遍历第2栏(即结束时间),所有值找到的结束时间计数前述这个事件,这是更大的比当前值(即查找全部 c非常地运行事件)。详细说明,假设第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一个内线也是最受欢迎的。

+0

什么是 “当前值”? – Kimvais 2010-11-16 09:04:06

+0

我已更新该问题。 “当前值”是当前正在处理的行的结束时间 – qwerty 2010-11-16 09:46:30

+0

请记住接受更适合您的问题的答案(如果有的话),并且如果您认为值得考虑,则最终将其投票。 – 2010-11-17 04:24:32

回答

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 

编辑

或者更awkish,如果你喜欢:

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 } 
+0

gawk抱怨说没有必要转义逗号。第二个输出行应该是1(测试应该是'<='而不是'<')。 [ideone](http://ideone.com/GDaL0) – 2010-11-16 15:10:07

+0

@丹尼斯逃脱的逗号是为了campatability。测试是根据要求*之前这个事件是大于当前值* – 2010-11-16 15:12:31

+0

感谢Belisarius! – qwerty 2010-11-17 04:19:23