我有数据(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。
答案 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
它会计算c
和s
次出现的次数。如果它们存在,还要计算其他字母。