我想计算输入文件(包含未排序的数值)的记录数,这些记录在最小值和最大值之间的一系列给定间隔内。
让我用一个例子解释一下。鉴于此输入:
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
循环。
提前致谢!
答案 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
。