使用 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
.
我想计算输入文件(包含未排序的数值)的记录数,这些记录落在一系列给定间隔内,介于最小值和最大值之间。
我举个例子解释一下。鉴于此输入:
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
.