在句点中划分列,并在awk中打​​印每个最大值

时间:2014-04-09 13:25:51

标签: awk max min period

我有一个内容为两列的数据文件。其中一个周期性变化,每个时期的最大值和最小值不同:

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):max = 5,min = 1.在第2个时期(从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

提前感谢您的帮助。

3 个答案:

答案 0 :(得分: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,则将第二列分配给max和min变量并开始递增标志。
  • 对于每一行,请检查第二列。如果它大于我们的max变量,则将该列赋值为max。同样明智的是,如果它小于我们的min变量,则将其分配给我们的min变量。继续递增旗帜。
  • 标志达到9后,打印期间编号,最小和最大变量。将标志重置为0并从下一行重新开始。

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

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