我正在尝试编写一个awk脚本。部分代码需要计算10美元(在256以下的代码中)是一定值的次数。 可能性为4,8,16,32,64,128,256 每当出现其中一个值时,我希望相应的变量加1。
我的代码块是
{
if ($10 == "4") {bs_4k++}
else if ($10 == "8") {bs_8k++}
if ($10 == "16") {bs_16k++}
if ($10 == "32") {bs_32k++}
if ($10 == "64") {bs_64k++}
if ($10 == "128") {bs_128k++}
if ($10 == "256") {bs_256k++}
};
这是数据的格式:
259,0 23 1 0.000000000 0 C WS 167588096 + 256 [0]
259,0 23 2 0.000002073 0 C WS 167588352 + 256 [0]
259,0 23 3 0.000004040 0 C WS 167587840 + 256 [0]
我打印结果的代码:
END {
print "Number of 256k blocks: " 256k_bs;
print "Number of 128k blocks: "128k_bs;
print "Number of 64k blocks: " 64k_bs;
print "Number of 32k blocks: " 32k_bs;
print "Number of 16k blocks: " 16k_bs;
print "Number of 8k blocks: " 8k_bs;
print "Number of 4k blocks: " 4k_bs;
};
当我尝试打印变量时,我得到了:
Number of 256k blocks: 256
Number of 128k blocks: 128
Number of 64k blocks: 64
Number of 32k blocks: 32
Number of 16k blocks: 16
Number of 8k blocks: 8
Number of 4k blocks: 4
感谢任何帮助。
答案 0 :(得分:2)
在awk中更简单的方法可能是使用数组而不是一组不同的变量。
使用这个awk脚本:
BEGIN{
for (i=4;i<=256;i=i*2) { valid[i] }
}
$10 in valid {
bs[$10]++
}
END {
for (n in bs) {
printf("Number of %dk blocks: %d\n", n, bs[n])
}
}
关于以下输入数据:
259,0 23 1 0.000000000 0 C WS 167588096 + 256 [0]
259,0 23 2 0.000002073 0 C WS 167588352 + 256 [0]
259,0 23 3 0.000004040 0 C WS 167587840 + 256 [0]
259,0 23 3 0.000004040 0 C WS 167587000 + 32 [0]
259,0 23 3 0.000004040 0 C WS 167587001 + 64 [0]
得到以下结果:
$ awk -f i.awk input.txt
Number of 64k blocks: 1
Number of 32k blocks: 1
Number of 256k blocks: 3
当然,如果您希望输出排序,您可以通过排序管道,或以不同方式构建您的awk数组。这些添加内容留给读者练习。 : - )
答案 1 :(得分:1)
您未在END
区块中使用变量。因此,数字部分按字面解释,然后正在评估变量k_bs
(未设置,因此您得到一个空字符串)。
将256k_bs
更改为bs_256k
等
答案 2 :(得分:0)
您可以使用单位工具集实现相同的功能
$ cut -d' ' -f10 file | sort -nr | uniq -c
3 256
1 64
1 32
并根据需要格式化结果。