使用awk计算列中特定值的数量

时间:2014-05-03 18:26:03

标签: awk text-parsing

我有数据(data.csv):

"1",5.1,"s"
"2",3.3,"s"
"3",2.7,"c"

我想计算其第三个元素是" s"或" c"使用AWK(count.awk):

BEGIN{FS=","; s_count=0; c_count=0}
($3=="s"){s_count++}
($3=="c"){c_count++}
END{print s_count; print c_count}

然后

$awk -f count.awk data.csv

但这不起作用。它的输出是:

0
0

这不是我的预期。为什么呢?

$ awk -V
GNU Awk 4.1.0, API: 1.0 (GNU MPFR 3.1.2, GNU MP 5.1.2)

注意:我在cygwin上使用Awk。

2 个答案:

答案 0 :(得分:4)

问题是你的目标字段嵌入了双引号,所以你也需要匹配它们,包括它们 - \ - 转义 - 要匹配的字符串:

awk '
  BEGIN{FS=","; s_count=0; c_count=0}
  ($3=="\"s\"") {s_count++}
  ($3=="\"c\"") {c_count++}
  END{ print s_count; print c_count }
  ' data.csv

另外,您可以稍微简化awk程序:

  • 不需要括号(尚未在cygwin上验证,但鉴于它是awk解释字符串,我不希望这是重要的)
  • 您不需要初始化输出变量,因为awk在数值上下文中将未初始化的变量默认为0
BEGIN{FS=","}
$3 == "\"s\"" {s_count++}
$3 == "\"c\"" {c_count++}
END{ print s_count; print c_count }

答案 1 :(得分:1)

这是阵列的工作。这是一个awk命令:

awk -F, '{gsub(/\"/,"",$3);a[$3]++} END {for (i in a) print i,a[i]}' file
c 1
s 2

它会计算cs次出现的次数。如果它们存在,还要计算其他字母。