2015-09-26 44 views
0

我運行一個程序,它輸出這樣的詩句(簡體)線的最長鏈:我如何「grep」可以匹配一個正則表達式

A 
E 
E 
R 
E 

等...而我試圖找到字母代碼E的最長出現次數,而沒有其他的東西。我懷疑最簡單的方法是嘗試連續N次查找N個連續降序的值,但我不確定如何執行特定情況,例如連續3次E行。使用sed命令很容易嗎?我認爲AWK圖案範圍,但它允許任何之間..

回答

4

使用現有的Unix工具集...匹配

uniq -c file | sort -k2 -k1,1nr | awk '/E/{print $1;exit}' 

uniq會給你的序列號,sort按名稱和計數(以相反的順序)所以最高運行次數將顯示在最上面。讓awk選擇最先設計的最高序列長度。

1

Perl的溶液:

program | perl -lne ' 
       if (/E/) { $c++ } 
        else { $c = 0 } 
       $m = $c if $m < $c; 
       }{ 
       print $m' 

$m記住哪些被遞增爲每個E和設置爲0的每個非-E的最大計數$c

2

使用awk:

BEGIN { currCount = maxCount = 0;} 
$0 == "E" { currCount++; 
      if(maxCount < currCount) {maxCount=currCount; line=NR;} 
      next 
      } 

     { currCount=0; } 

END { print "max sequence is " maxCount " ending at line " line } 

如果行必須格局,而不是正好等於該字符串,使用的/E/代替$0 == "E"

1
$ uniq -c file | awk '/E/&&($1>m){m=$1} END{print m+0}' 
2