在时段中划分列,并在awk中打印每个列的最小最大值

在时段中划分列,并在awk中打印每个列的最小最大值,awk,max,min,period,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 我们可以发现,在第一个周期(从a到i):max=5,min=1。在第二个周期(

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

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
我们可以发现,在第一个周期(从a到i):max=5,min=1。在第二个周期(从i到u):最大值=6,最小值=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 }
提前感谢您的帮助

试试以下方法:

$ 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
$awk'
开始{打印“期间”、“最小”、“最大”}
!f{min=$2;max=$2;++f;next}

{max=($2>max)?$2:max;min=($2我已经开始,所以我将完成。我选择创建一个数组,其中包含每个时段的最小值和最大值:

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
awk-v周期=9'
开始{打印“期间”、“最小”、“最大”}
NR%周期==1{++i}
!min[i]| |$2max[i]{max[i]=$2}
结束{for(i in min)打印i,min[i],max[i]}输入
索引
i
周期
行数(在本例中为
9
)增加一次。如果尚未设置值或找到新的最小值/最大值,请更新数组

编辑:如果尚未设置
max[i]
,则
$2>max[i]
,因此无需检查
!max[i]

awk'开始{print“Period”,“min”,“max”}
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
NR==1 | |(NR%10==0){mi=ma=$2} {$2ma?ma=$2:0} NR%9==0{print++i,mi,ma}您的_文件

测试器< /P>每个周期的长度是如何确定的?我们可以考虑9个周期,每次我们有一个最大值,一个是我希望得到的输出文件。谢谢!!)我开始了(但在我的例子中没有完成),几乎是相同的。只是我用这个来设置min和max:<代码> max [var ] = max [var ] < 2美元?2美元:max [var ]。;min[var]=(min[var]&&min[var]@fedorqui感谢您的输入。看看您的输入,我意识到我的

!max[I]
,虽然对称性很好,但却是多余的。我想我会删除它。我发现我的方法稍微清晰一些,但我可能有偏见;)
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