过滤特定列

时间:2012-01-25 21:34:18

标签: bash shell awk

我有这些数据行

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

1 个答案:

答案 0 :(得分: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   

在此处查看此行动:http://ideone.com/pbpmO