2014-04-09 38 views
2

我有一個數據文件裏面有兩列內容。其中一人有誰的最大值和最小值都在每一個時期不同的週期性變化:在一段時間內劃分一列,並在awk中打​​印出每個最小值max

a  3 
b  4 
c  5 
d  4 
e  3 
f  2 
g  1 
h  2 
i  3 
j  4 
k  5 
l  6 
m  5 
n  4 
o  3 
p  2 
q  1 
r  0 
s  1 
t  2 
u  3 

我們可以發現,在第1期(從A到I):最大= 5,分= 1。在第二階段(從i到u):max = 6,min = 0.

使用awk,我只能打印所有第二列的最大值和最小值,但不能在每個週期後打印最小值和最大值。這意味着我希望得到的結果是這樣的:

period min max 
1  1  5 
2  0  6 

這裏是我做過什麼:

{ 
nb_lignes = 21 
period = 9 
nb_periodes = int(nb_lignes/period) 
} 

{ 
for (j = 0; j <= nb_periodes; j++) 
    { if (NR == (1 + period*j)) {{max=$2 ; min=$2}} 
     for (i = (period*j); i <= (period*(j+1)); i++) 
      { 
       if (NR == i) 
        { 
        if ($2 >= max) {max = $2} 
        if ($2 <= min) {min = $2} 
        {print "Min: "min,"Max: "max,"Ligne: " NR} 
        } 
      } 
    } 
} 
#END { print "Min: "min,"Max: "max } 

然而結果是遠離我的搜索:

Min: 3 Max: 3 Ligne: 1 
Min: 3 Max: 4 Ligne: 2 
Min: 3 Max: 5 Ligne: 3 
Min: 3 Max: 5 Ligne: 4 
Min: 3 Max: 5 Ligne: 5 
Min: 2 Max: 5 Ligne: 6 
Min: 1 Max: 5 Ligne: 7 
Min: 1 Max: 5 Ligne: 8 
Min: 1 Max: 5 Ligne: 9 
Min: 1 Max: 5 Ligne: 9 
Min: 4 Max: 4 Ligne: 10 
Min: 4 Max: 5 Ligne: 11 
Min: 4 Max: 6 Ligne: 12 
Min: 4 Max: 6 Ligne: 13 
Min: 4 Max: 6 Ligne: 14 
Min: 3 Max: 6 Ligne: 15 
Min: 2 Max: 6 Ligne: 16 
Min: 1 Max: 6 Ligne: 17 
Min: 0 Max: 6 Ligne: 18 
Min: 0 Max: 6 Ligne: 18 
Min: 1 Max: 1 Ligne: 19 
Min: 1 Max: 2 Ligne: 20 
Min: 1 Max: 3 Ligne: 21 

謝謝你事先爲你提供幫助。

+1

如何每個週期的長度來確定 –

+0

我們可以考慮9個週期,每次我們有一個最大值和一個最小值 – user3515154

回答

1

試着這麼做:

$ awk ' 
BEGIN{print "period", "min", "max"} 
!f{min=$2; max=$2; ++f; next} 
{max = ($2>max)?$2:max; min = ($2<min)?$2:min; f++} 
f==9{print ++a, min, max; f=0}' file 
period min max 
1 1 5 
2 0 6 
  • 當標誌f沒有設置,分配第二列到最大和最小的變量,並開始增加你的旗幟。
  • 對於每一行,請檢查第二列。如果它大於我們的最大變量,則將該列分配給最大值。就像明智一樣,如果它小於我們的最小變量,則將其分配給我們的最小變量。繼續增加標誌。
  • 標誌達到9後,打印週期編號,最小和最大變量。將標誌重置爲0,並從下一行重新開始。
+1

這就是我希望獲得的輸出文件。謝謝 ! :) – user3515154

1

我已經開始了,所以我會完成。我選擇創建包含用於每個週期的最小和最大的數組:

awk -v period=9 ' 
BEGIN { print "period", "min", "max" } 
NR % period == 1 { ++i } 
!min[i] || $2 < min[i] { min[i] = $2 } 
$2 > max[i] { max[i] = $2 } 
END { for (i in min) print i, min[i], max[i] }' input 

索引i增加每period行數(在此情況下9)。如果尚未設置任何值或已找到新的最小/最大值,請更新陣列。

編輯:如果max[i]尚未設置,那麼$2 > max[i],所以不需要檢查!max[i]

+0

非常有趣,我開始(但沒有完成在我的情況下)幾乎相同。只有我用它來設置最小值和最大值:'max [var] = max [var] <$ 2? $ 2:max [var]; min [var] =(min [var] && min [var] <$ 2)? min [var]:$ 2' – fedorqui

+1

@fedorqui感謝您的意見。看着你的,我意識到我的'!max [i]'雖然對於對稱很好,但卻是多餘的。我想我會刪除它。我發現我的方法稍微清晰一些,但是再一次,我可能會有偏見;) –

0
awk 'BEGIN{print "Period","min","max"} 
    NR==1||(NR%10==0){mi=ma=$2} 
    {$2<mi?mi=$2:0;$2>ma?ma=$2:0} 
    NR%9==0{print ++i,mi,ma}' your_file 

here