AWK计算术语相对于其他列出现的次数

时间:2015-06-22 23:37:48

标签: linux shell command-line awk sed

给定CSV文件:

id, fruit, binary
1, apple, 1
2, orange, 0
3, pear, 1
4, apple, 0
5, peach, 0
6, apple, 1

如何计算水果中的每个唯一值

  

二进制值= 1 /出现次数的次数   果实出现在水果柱中   ?

另一种方法是将每个独特水果的二进制列的值相加。

例如:

对于水果苹果,它以二进制= 1出现两次,频率为3.因此我将获得2/3。

如何用高效的AWK代码编写?

我知道我可以这样做以从第二列中获取唯一值:

cut -d , -f2 file.csv | sort | uniq | 

awk '{ a[$2]++ } END { for (b in a) { print b } }' file.csv

所以我的非工作代码如下所示:

 cat file.csv | awk '{ a[$2]++ } END { for (b in a) if ($3==1) {sum+=$3} END {print $0 sum}' 

awk '{ a[$2]++ } END { for (b in a) { sum +=1 } }' file.csv

需要帮助来纠正我的语法并合并2个awk代码

2 个答案:

答案 0 :(得分:1)

这对你有用吗?

 $ cat file.csv
    1, apple, 1
    2, orange, 0
    3, pear, 1
    4, apple, 0
    5, peach, 0
    6, apple, 1

$ cat file.csv|awk -F',' '{ $3 == 1 && fruit[$2]++; tfruit[$2]++ } END { for ( fr in tfruit) { print fr, fruit[fr], tfruit[fr] } }'
 pear 1 1
 apple 2 3
 orange  1
 peach  1

答案 1 :(得分:0)

与其他答案几乎相同,但打印0而不是空白。

AMD$ awk -F, 'NR>1{a[$2]+=$3;b[$2]++} END{for(i in a)print i, a[i], b[i]}' File
pear 1 1
apple 2 3
orange 0 1
peach 0 1

,作为字段分隔符。对于除第一行之外的所有行,更新数组a。即$2(fruit name)被视为索引,并将binary1的次数加起来。同时将b[$2]增加1,这将是看到fruit的次数。最后,打印fruitbinary countnum of times fruit seen。希望很清楚。