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

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

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

ExceptionA
loggedFunctionCall
ExceptionB
ExceptionA
loggedFunctionCall
ExceptionD
ExceptionB
loggedFunctionCall
ExceptionB

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

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

结果:

      1 ExceptionD
      2 ExceptionA
      3 ExceptionB

不过我想在右侧显示计数并去掉这些缩进,所以最终的效果应该如下所示:

ExceptionD 1
ExceptionA 2
ExceptionB 3

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

答案1

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

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

输出

ExceptionD 1
ExceptionA 2
ExceptionB 3

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


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

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

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

grep 'Exception' file | sort | uniq -c | awk '{print $2,$1}' | sort -nk2

答案2

perl

perl -lne '$h{$_}++ if /Exception/;
           END{print "$_ $h{$_}" for sort {$h{$a} <=> $h{$b}} keys %h}'

sort {$h{$a} <=> $h{$b}} keys %h将根据哈希值进行排序。看https://perldoc.perl.org/functions/keys了解详情。

相关内容