给定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代码
答案 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)
被视为索引,并将binary
为1
的次数加起来。同时将b[$2]
增加1,这将是看到fruit
的次数。最后,打印fruit
,binary count
和num of times fruit seen
。希望很清楚。