我有一个包含两列的数据文件。其中之一具有周期性变化,每个周期的最大值和最小值不同:
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):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
预先感谢您的帮助。
最佳答案
尝试类似:
$ 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 并从下一行重新开始。
关于awk - 在周期中划分一列并在 awk 中打印每个列的最小值最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22963993/