9

我知道这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 的解决方案吗?提前致谢!

4

3 回答 3

25

这非常有效......感谢大家的评论!

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

于 2013-09-18T14:38:04.880 回答
6

一般来说,如果您想 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]}
    最后,遍历结果并打印它们。
于 2016-08-18T09:45:12.273 回答
2

这是一个 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
于 2013-09-11T23:20:42.487 回答