awk计数给定范围内的位数

awk计数给定范围内的位数,awk,Awk,如何计算字段中给定数字范围内的数字出现的次数 例如,原始文本foo.txt如下所示: 2,3,4,2,4 2,3,4,32,4 2,3,4,12,4 2,3,4,4,4 2,3,4,,4 2,3,4,15,4 2,3,4,15,4 我想计算字段#4中的一个数字在以下范围内的次数:[0,10]和[10,20],其中下界包含在内,上界不包含在内 结果应该是: 范围0-10:2 范围10-20:3 下面是我的awk代码,但我在两个范围内都得到8600001, awk-f prog.awk foo.t

如何计算字段中给定数字范围内的数字出现的次数

例如,原始文本
foo.txt
如下所示:

2,3,4,2,4
2,3,4,32,4
2,3,4,12,4
2,3,4,4,4
2,3,4,,4
2,3,4,15,4
2,3,4,15,4
我想计算字段#4中的一个数字在以下范围内的次数:[0,10]和[10,20],其中下界包含在内,上界不包含在内

结果应该是:

范围0-10:2 范围10-20:3

下面是我的awk代码,但我在两个范围内都得到8600001,
awk-f prog.awk foo.txt

#!/usr/range/awk
# prog.awk

BEGIN {
    FS=",";
    $range1=0;
    $range2=0;
}
$4 ~ /[0-9]/ && $4 >= 0 && $4 < 10 { $range1 += 1 };
$4 ~ /[0-9]/ && $4 >= 10 && $4 < 20 { $range2 += 1 };
END {
    print $range1, "\t", $range2;
}
!/usr/range/awk
#程序awk
开始{
FS=“,”;
$range1=0;
$range2=0;
}
$4~/[0-9]/&&4>=0&&4<10{$range1+=1};
$4~/[0-9]/&&$4>=10&&$4<20{$range2+=1};
结束{
打印$range1、“\t”、$range2;
}
原始代码的修改版本 在awk中,
$range1
是编号为
range1
的字段的值。这不是您想要的。如果您没有引用字段编号,请不要使用
$
。因此:

BEGIN {
    FS=",";
    range1=0;
    range2=0;
}
$4 ~ /[0-9]/ && $4 >= 0 && $4 < 10 { range1 += 1 };
$4 ~ /[0-9]/ && $4 >= 10 && $4 < 20 { range2 += 1 };
END {
    print range1, "\t", range2;
}
开始{
FS=“,”;
范围1=0;
范围2=0;
}
$4~/[0-9]/&&4>=0&&4<10{range1+=1};
$4~/[0-9]/&&$4>=10&&$4<20{range2+=1};
结束{
打印范围1,“\t”,范围2;
}
请注意,没有必要将范围变量初始化为零:零是数值变量的默认值

原始代码的修改版本 在awk中,
$range1
是编号为
range1
的字段的值。这不是您想要的。如果您没有引用字段编号,请不要使用
$
。因此:

BEGIN {
    FS=",";
    range1=0;
    range2=0;
}
$4 ~ /[0-9]/ && $4 >= 0 && $4 < 10 { range1 += 1 };
$4 ~ /[0-9]/ && $4 >= 10 && $4 < 20 { range2 += 1 };
END {
    print range1, "\t", range2;
}
开始{
FS=“,”;
范围1=0;
范围2=0;
}
$4~/[0-9]/&&4>=0&&4<10{range1+=1};
$4~/[0-9]/&&$4>=10&&$4<20{range2+=1};
结束{
打印范围1,“\t”,范围2;
}

请注意,无需将范围变量初始化为零:零是数值变量的默认值。

另一个
awk

$ awk -F, '$4>=0{a[int($4/10)]++} 
             END{print "range 0-10:" a[0],"range 10-20:" a[1]}' file

range 0-10:2 range 10-20:3
可以很容易地扩展到整个范围

$ awk -F, '$4>=0{a[int($4/10)]++} 
             END{for(k in a) print "range ["k*10"-"(k+1)*10"):", a[k]}' file

range [0-10): 2
range [10-20): 3
range [30-40): 1

另一个
awk

$ awk -F, '$4>=0{a[int($4/10)]++} 
             END{print "range 0-10:" a[0],"range 10-20:" a[1]}' file

range 0-10:2 range 10-20:3
可以很容易地扩展到整个范围

$ awk -F, '$4>=0{a[int($4/10)]++} 
             END{for(k in a) print "range ["k*10"-"(k+1)*10"):", a[k]}' file

range [0-10): 2
range [10-20): 3
range [30-40): 1

你的意思是“数字”还是“数字”?数字是单个数字;当然,它们也是数字,但是
10
是一个由两个数字表示的单个数字。从第4列的预期输出判断,你在计算数字,而不是数字。有趣的情况是空字段;很容易将其计算为零而不是零一个没有数字的空字段。请注意,
awk
使用
$
表示字段编号,而不是一般变量。在初始化过程中,
$range1=0
$0
设置为
0
,因为未定义
range1
,因此它相当于零作为一个数字或空字符串。删除
$
。你是指“数字”还是“数字”?数字是单个数字;当然,它们也是数字,但是
10
是一个由两个数字表示的单个数字。从第4列的预期输出判断,您是在计算数字,而不是数字。有趣的情况是空字段;很容易将其计算为零而不是零n作为一个空字段,其中没有数字。请注意,
awk
使用
$
表示字段编号,而不是一般变量。在初始化过程中,
$range1=0
$0
设置为
0
,因为未定义
range1
,因此它相当于零作为一个数字或空字符串。删除
$