【问题标题】:Count number of times a word shows up in a two column array in awk计算一个单词在 awk 的两列数组中出现的次数
【发布时间】:2014-02-28 06:04:30
【问题描述】:

如何计算一个单词在 awk 的数组的两列中出现的次数? (同一个词可以出现在任一列上,但我需要两者都加一个到计数中)。然后,我需要打印每个单词出现的次数。 例如,其中一部分可能是:

Sarah Jenny
Carlos Javi
Jenny Mark
Calab Charles
Charles Jenny

我需要打印出来

Sarah 1
Jenny 3
Carlos 1
Javi 1
Mark 1
Charles 2

【问题讨论】:

  • 看来你已经问过几个awk问题了,那你为此做了什么?
  • 好吧,我删除了我拥有的东西......所以它不再在我的代码中。我尝试创建某种变量,只要出现一个单词就会加 1 ......但我认为我主要有问题,因为数组中有两列 @BMW
  • 那为什么不把代码放回去呢?

标签: awk multiple-columns


【解决方案1】:

您可以创建一个数组并存储名称和索引。稍后遍历数组并打印我们的名字和他们的计数。比如:

awk '{for(x=1;x<=NF;x++)count[$x]++}END{for(name in count) print name,count[name]}' file

$ cat file
Sarah Jenny
Carlos Javi
Jenny Mark
Calab Charles
Charles Jenny

<~/Temp>$ awk '{for(x=1;x<=NF;x++)count[$x]++}END{for(name in count) print name,count[name]}' file
Javi 1
Mark 1
Carlos 1
Calab 1
Charles 2
Sarah 1
Jenny 3

【讨论】:

  • 注意:使用count[tolower($x)]++ 允许不区分大小写的计数。
【解决方案2】:

gnu awk 版本

awk -v RS=" |\n" '{a[$1]++} END { for (i in a) print i,a[i]}' file
Calab 1
Charles 2
Mark 1
Jenny 3
Sarah 1
Javi 1
Carlos 1

喜欢排序的可以加| sort -nrk 2

此解决方案打破了 opp 所有行,因此每个单词都换行。
这让计数变得更加简单。

如果不确定是空格还是制表符,请更改为RS="[[:space:]]+|\n"
就像 jaypal 写的那样,忽略大小写,使用a[tolower($1)]++

由于RS 中有多个字符,您需要gnu awk


全部包含

awk -v RS="[[:space:]]+|\n" '{a[tolower($1)]++} END { for (i in a) print i,a[i]}' file | sort -nrk 2
jenny 3
charles 2
sarah 1
mark 1
javi 1
carlos 1
calab 1

【讨论】:

    【解决方案3】:

    如果输入文件只有您想要使用的那两列。那么这应该足以完成工作

    chidori@ubuntu:~$ cat input.txt
    Sarah Jenny
    Carlos Javi
    Jenny Mark
    Calab Charles
    Charles Jenny
    
    chidori@ubuntu:~$ tr -s ' ' '\n' < input.txt | sort | uniq -c
          1 Calab
          1 Carlos
          2 Charles
          1 Javi
          3 Jenny
          1 Mark
          1 Sarah
    chidori@ubuntu:~$
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      相关资源
      最近更新 更多