【问题标题】:AWK count number of times a term appear with respect to other columnsAWK count 术语相对于其他列出现的次数
【发布时间】:2015-09-08 14:14:55
【问题描述】:

给定一个 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 代码方面需要帮助

【问题讨论】:

标签: linux shell command-line awk sed


【解决方案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

【讨论】:

  • 您能否在第一列打印零而不是空白,并有一个额外的列来获得最终值?另外,tfruit[$2]++ 是什么意思?
  • 希望您从 A.M.D 的其他答案中得到解释
  • 你能帮我解决我上面的最后一条评论吗?
  • 应该很简单。在打印 a[i],b[i] 之后添加 a[i]/b[i] 以打印第 4 列
  • awk -F',' '{ fr[$2]+=$3; tf[$2]++ } END { for (f in tf) { print f, fr[f], tf[f], fr[f]/tf[f] } }' 文件
【解决方案2】:

与其他答案几乎相同,但打印 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] 加一,这将是看到fruit 的次数。最后,打印fruitbinary countnum of times fruit seen。希望清楚。

【讨论】:

  • 我对 awk 很陌生,所以我可以澄清一下:当代码中有 END 时,这是否意味着代码将从右侧运行(在 END 之后)然后向左运行(@987654333 @),类似于写一个 for 循环? (即 for i in array: do this)另外,ab 是您定义的两个单独的数组吗?
  • 是的,a 和 b 是单独的数组... END { } 将在处理所有行结束时执行...类似地 BEGIN { } 将在开始处理第一行之前执行。 ..你可以用谷歌搜索...
  • 是否可以在代码中添加一个等于 $2/$3 的新列 ($4)?
  • 实际上获取第二列的十进制值,可能缺少什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
相关资源
最近更新 更多