【问题标题】:How to grep number of unique occurrences如何grep唯一出现的次数
【发布时间】:2013-09-11 22:37:48
【问题描述】:

我了解grep -c string 可用于计算给定字符串的出现次数。我想做的是在只有部分字符串已知或保持不变时计算唯一出现的次数。

例如,如果我有一个文件(在本例中是一个日志),其中有几行包含一个常量字符串和一个重复变量,如下所示:

string=value1
string=value1
string=value1
string=value2
string=value3
string=value2

我希望能够通过类似于以下的输出来识别每个唯一集的数量:(理想情况下使用单个 grep/awk 字符串)

value1 = 3 occurrences
value2 = 2 occurrences
value3 = 1 occurrences

有没有人有使用 grep 或 awk 的解决方案可能有效?提前致谢!

【问题讨论】:

  • I understand that grep -c string can be used to count the occurrences of a given string. 这不是真的。它计算匹配行。例如你grep -c foo <<< "foo foo foo" 将返回1
  • 我曾想过尝试类似 grep -c wwn=* <fileName> 的方法,但我不确定如何获取每个唯一出现的 "www=" 和/或字符串本身的计数。

标签: bash awk grep


【解决方案1】:

效果很好...感谢大家的 cmets!

grep -oP "wwn=[^,]*" path/to/file | sort | uniq -c

【讨论】:

  • 当我尝试这个时,我发现了一些有趣的东西。当我在尝试查找唯一事件之前没有进行排序时,uniq 似乎无法正常运行,无论如何我都会遇到所有事件。还有人注意到吗?
  • sort 命令获取项目列表并按字母和数字对它们进行排序。 uniq 命令获取项目列表并删除相邻的重复行。关键字“相邻”重复。首先对输出进行排序确保重复的字符串彼此相邻,以便uniq 命令处理。
【解决方案2】:

一般来说,如果您想 grep 并跟踪结果,最好使用awk,因为它以非常简单的语法以清晰的方式执行这些操作。

所以对于你给定的文件,我会使用:

$ awk -F= '/string=/ {count[$2]++} END {for (i in count) print i, count[i]}' file
value1 3
value2 2
value3 1

这是在做什么?

  • -F=
    将字段分隔符设置为=,以便我们计算它的左右部分。
  • /string=/ {count[$2]++}
    当找到模式“string=”时,检查它!这使用数组 count[] 来跟踪第二个字段到目前为止出现的时间。
  • END {for (i in count) print i, count[i]}
    最后,遍历结果并打印出来。

【讨论】:

    【解决方案3】:

    这是一个 awk 脚本:

    #!/usr/bin/awk -f
    
    BEGIN {
        file = ARGV[1]
        while ((getline line < file) > 0) {
            for (i = 2; i < ARGC; ++i) {
                p = ARGV[i]
                if (line ~ p) {
                    a[p] += !a[p, line]++
                }
            }
        }
        for (i = 2; i < ARGC; ++i) {
            p = ARGV[i]
            printf("%s = %d occurrences\n", p, a[p])
        }
        exit
    }
    

    例子:

    awk -f script.awk somefile ab sh
    

    输出:

    ab = 7 occurrences
    sh = 2 occurrences
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 2014-07-23
      • 2020-01-23
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多