2012-01-25 54 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 

看到它在这里的行动: