搜索模式和打印命中率低于阈值

时间:2014-10-10 09:29:27

标签: arrays awk count

这是我需要的一个例子:

INPUT:

a 5
a 7
a 11
b 10
b 11
b 12
.
.
.

输出:

a 2
b 0

因此输出应该低于我的阈值(在这种情况下,它是2美元<10)。

我的代码是:

awk 'OFS="\t" {v[$1]+=$2;  n[$1]++} END {for (l in n) {print l, n[l]} }' input

我的输出是

a 3
b 3

我不确定在何处放置条件$2 < 10

1 个答案:

答案 0 :(得分:2)

您可以使用$2 < value检查阈值条件,其中valueawk给出的-v value=XX变量。

此外,您正在使用v[$1]+=$2:此总和,不计算匹配的案例。

总之,我会用这个:

awk -v t=10 '{list[$1]} $2<t {count[$1]++} END {for (i in list) print i, count[i]+0}' file

注意我们需要使用两个数组:一个用于跟踪计数器,另一个用于跟踪所有可能的值。

解释

  • -v t=10提供门槛。
  • {list[$1]}跟踪出现的所有可能的第一个字段。
  • $2<t {count[$1]++}如果第二个字段小于阈值,则递增计数器。
  • END {for (i in list) print i, count[i]+0}最后,遍历所有第一个字段并打印它们的值低于阈值的次数。如果未设置该值,count[i]+0技巧会使其打印0

测试

$ awk -v t=10 '{list[$1]} $2<t {count[$1]++} END {for (i in list) print i, count[i]+0}' a
a 2
b 0