2014-02-08 150 views
0

我有一個格式如下的文件:獲取文件中尺寸的最大值和最小值

每個包都是一行。

的行開始與袋上的標籤,也就是0或1。

然後有一個標籤,並在該袋的點的數量。

這後跟一個空格,然後爲每個點對每個8種尺寸的點的值的列表。

例如,

label npx x11 x12 x13 x14 x15 x16 x17 x18 x21 x22 x23 x24 ... 
label npy y11 y12 y13 y14 x15 x16 x17 x18 y21 y22 y23 y24 ... 

我想在所有的袋子找到每個八個維度的最大值和最小值。也就是說,忽略從第1,第9,第17,第25,第33,第41標籤和NPX列,最大值和最小值,...列,從第2的最大值和最小值,第10,第18,第26,第34 ,第42,...列等

每個包中有不同數量的點,但每個點總是有8個維度。

我相信你可以用一些Unix工具來做到這一點,但我對這些能夠自信地做到這一點還不夠了解。你如何獲得這些信息?

+1

你對如何做到這一點的想法?這不是一項簡單的任務,所以你應該表現出一些努力。也許你可以把它分解成幾個較小的任務,然後詢問其中的一個 - 例如,「我怎樣才能將值讀入數組?」或者「我怎樣才能遍歷數組的每個第8個元素?」 –

+1

請更具體一點,如果您在輸入時顯示預期輸出,那麼回答將會有所幫助。 –

回答

1

這當然不是穩健的(文件不得有在開始任何空行,例如),但應該讓你開始:

awk ' 
    NR==1{for(i=3;i<=10;i++) max[ i % 8 ] = min[ i % 8 ] = $i } 
    { 
     for(i=3; i<=NF;i++) { 
      if(max[ i % 8 ] < $i) 
       max[ i % 8 ]=$i 
      if(min[ i % 8 ] > $i) 
       min[ i % 8 ] = $i 
     } 
    } 
    END { 
     for(i=0;i<8;i++) printf "max in position %d: %d\n", i+1, max[(i+3)%8] 
     for(i=0;i<8;i++) printf "min in position %d: %d\n", i+1, min[(i+3)%8] 
    }' input-file 
相關問題