使用awk以间隔分布值

时间:2015-07-02 14:52:03

标签: awk gawk

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

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

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

我想计算第二个字段在0-10区间内的行数,11-20,21-30等(步骤= 10)

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

这给了我这样的计数:

 4 2 0 0 1

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

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

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

很抱歉,我的代码片段可以更精确,但我之前从未在awk中使用for循环。

提前致谢!

1 个答案:

答案 0 :(得分:1)

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

$ cat tst.awk
{
    bucket = int(($2/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