每次出现后打印唯一模式出现的计数

kom*_*awi 5 grep awk text-processing sort uniq

假设我有一个包含抛出异常的日志文件:

ExceptionA
loggedFunctionCall
ExceptionB
ExceptionA
loggedFunctionCall
ExceptionD
ExceptionB
loggedFunctionCall
ExceptionB
Run Code Online (Sandbox Code Playgroud)

我想计算每个不同异常的出现次数,目前我的解决方案是:

cat file.txt | grep Exception | sort | uniq -c | sort -n

结果:

      1 ExceptionD
      2 ExceptionA
      3 ExceptionB
Run Code Online (Sandbox Code Playgroud)

但是我想在右侧显示计数并摆脱这些缩进,因此最终效果应如下所示:

ExceptionD 1
ExceptionA 2
ExceptionB 3
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个简单的解决方案 - 最好不编写任何额外的 bash 脚本,只需使用纯终端命令即可。

tha*_*isp 8

您可以对整个任务使用一个简单的 awk 命令:

awk '/Exception/{a[$0]++} END {for (x in a) print x,a[x]}' file | sort -nk2
Run Code Online (Sandbox Code Playgroud)

输出

ExceptionD 1
ExceptionA 2
ExceptionB 3
Run Code Online (Sandbox Code Playgroud)

awk关联数组的顺序未定义,因此通常您需要通过管道连接到sortk2意味着按第二个字段排序。


另一种排序方法是使用 GNUawk 预定义排序并按数值升序排序:

awk '/Exception/{a[$0]++} END {
        PROCINFO["sorted_in"] = "@val_num_asc"
        for (x in a) print x,a[x]
    }' file
Run Code Online (Sandbox Code Playgroud)

此外,如果您想保留现有命令,并且只是反转两个字段的位置,您可以修改为:

grep 'Exception' file | sort | uniq -c | awk '{print $2,$1}' | sort -nk2
Run Code Online (Sandbox Code Playgroud)