2012-01-25 58 views
2

我有這些類型的數據行的過濾特定的列

0 0 8 85 105 7 0 0 0 0 0 0 0 0 0 0 
0 0 0 51 41 5 0 0 0 0 0 0 0 0 0 0 
6 24 264 223 12 0 0 0 0 0 0 0 0 0 0 0 
0 6 58 65 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 50 98 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 100 0 0 0 0 0 0 0 0 0 0 0 0 

我怎樣才能找到最大的兩個數字(和一個在他們面前,一次次他們),他們的記錄中的位置?如果我只有這一點(只有一個值)

0 0 0 100 0 0 0 0 0 0 0 0 0 0 0 0 

打印出來只是一個最大和前一個,後兩個值

我應該得到這樣的:

# [position column index] [value] ... 

3 8 4 85 5 105 6 7 # <--- 3rd colum value 8, 4th column value 85,...etc 
3 0 4 51 5 41 6 5 
2 24 3 264 4 223 5 12 
2 6 3 58 4 65 5 0 
2 0 3 50 4 98 5 0 
3 0 4 100 5 0 6 0 
+2

我不完全瞭解如何從輸入到,如果你有一個記錄發生的事情所需要的輸出 – SiegeX

+0

我編輯了帖子中所需要的輸出... – user1116360

+0

像'6 24 264 264 12 0 0 0 0 0 0 0 0 0 0 0'?祝你好運。 – shellter

回答

1

像這樣的東西幾乎可以正常工作,沒有特別的情況,就像問題提到的那樣:6 24 264 264 12 0 0 0 0 0 0 0 0 0 0 0 ...實際上你的最後一行也是可以導致問題的...

awk 'BEGIN {FS=" "} 
    { for (i=1;i<=NF;i++) {line[i]=$i} 
     m1=0; m2=0 
     for (e in line) { 
      if (m1 <= line[e]) { m1=line[e]; m1i=e } } 
     for (e in line) { 
      if (m2 <= line[e] && line[e]<m1) { m2=line[e]; m2i=e } } 
     if (m1i<=m2i) { first=m1i-1;last=m2i+1 } 
     else { first=m2i-1;last=m1i+1 } 
     if (first<1) { first=1 } 
     for (i=first;i<=last;i++) {printf("%s%s%s%s", i, FS, line[i], FS)} 
     printf("\n") 
}' FILE 

看到它在這裏的行動: