如何在awk中找到值时递增计数器

时间:2016-07-01 15:00:52

标签: awk scripting

我正在尝试编写一个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

感谢任何帮助。

3 个答案:

答案 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

并根据需要格式化结果。