使用命令行工具对sorting序列中的重复项进行计数

我有一个命令(cmd1),通过日志文件greps过滤出一组数字。 数字是随机的顺序,所以我使用sort -gr来获得一个反向sorting的数字列表。 这个sorting列表中可能有重复。 我需要find该列表中每个唯一编号的计数。

例如,如果cmd1的输出是

 100 100 100 99 99 26 25 24 24 

我需要另一个命令,我可以pipe上述输出,以便我得到:

 100 3 99 2 26 1 25 1 24 2 

如果您可以处理输出格式稍有不同的情况,则可以这样做:

 cmd1 | tr " " "\n" | uniq -c 

你会回来:

  3 100 2 99 1 26 1 25 2 24 

还要加上-u开关。 因此你会有:

 cmd1 | sort -gru 

从sorting手册页:

-u,–unique
没有-c,只输出第一个平等的运行

(我假设你的input是每行一个数字,因为这是什么types的输出。)

你可以试试awk:

<your_command> | awk '{numbers[$1]++} END {for (number in numbers) print number " " numbers[number]}'

这会给你一个没有sorting的列表(在我所知的情况下,数组在awk中的排列顺序是未定义的),所以你必须再次按照你的喜好sorting。

 $ echo '100 100 100 99 99 26 25 24 24' | perl -e 'while (<>) { chomp; my %nums; foreach (split(/ /)) { $nums{$_} += 1; }; foreach (sort {$b <=> $a} keys %nums) { print "$_ $nums{$_} " }; print "\n"; }' 100 3 99 2 26 1 25 1 24 2