使用 awk 在区间内分配值

distribution of values in intervals with awk

我想计算输入文件(包含未排序的数值)的记录数,这些记录落在一系列给定间隔内,介于最小值和最大值之间。

我举个例子解释一下。鉴于此输入:

 text 12
 text 1
 xxxx 19
 ffff 0
 dddd 5
 dddd 7
 pppp 41

我想统计第二个字段在0-10、11-20、21-30等区间的行数(step = 10)

 awk '{ 
 if      ( =< 10) first++
 else if ( > 10 &&  <= 20)
 second++
 else if ( > 20 &&  <= 30)      
 third++
 else if ( > 30 &&  <= 40)
 fourth++
 else if ( > 40 &&  <= 50)
 fifth++
 } END {
 print first,second,third,forth,fifth
 }' input.txt

这给了我这样的计数:

 4 2 0 0 1

问题是我想构建脚本,以便间隔范围的结束和间隔数可以是任意的,具体取决于输入。

也就是说,我想用文件中的最大值(41)来定义最后一个范围。给定 step=10,最后一个范围将自动分配给 41-50。但是这些数字会根据输入而改变。

有没有办法构建一个满足我需要的 for 循环?

抱歉,我的代码片段不能更精确,但我以前从未在 awk 中使用 for 循环来处理此类事情。

提前致谢!

我对你的问题感到困惑,但如果我明白你想要什么,那么这是正确的方法:

$ cat tst.awk
{
    bucket = int((/10)+1)
    count[bucket]++
    max = ((NR==1 || bucket>max) ? bucket : max)
}
END {
    for (bucket=1;bucket<=max;bucket++) {
        printf "%d%s", count[bucket], (bucket<max?OFS:ORS)
    }
}

$ awk -f tst.awk file
4 2 0 0 1

10 更改为您喜欢的任何数字,或者根据需要使用变量。如果你有一个预定义的最大值 bucket 你想使用那么也使用一个变量而不是计算 max.