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
,因此它相当于零作为一个数字或空字符串。删除$
。