2010-11-16 43 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