在时段中划分列,并在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