使用命令行工具计算排序序列中的重复项

使用命令行工具计算排序序列中的重复项

我有一个命令 (cmd1),它通过 grep 查询日志文件以过滤出一组数字。这些数字是随机排列的,所以我用它sort -gr来获取一个反向排序的数字列表。这个排序列表中可能会有重复项。我需要找到该列表中每个唯一数字的计数。

例如,如果 cmd1 的输出是

100 100 100 99 99 26 25 24 24

我需要另一个命令来将上述输出传送到该命令,以便得到:

100 3 99 2 26 1 25 1 24 2

答案1

如果您可以处理稍微不同的格式的输出,您可以执行以下操作:

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

你会得到以下回复:

  3 100
  2 99
  1 26
  1 25
  2 24

答案2

还要添加 -u 开关。因此,您将获得:

cmd1 | sort -gru

来自排序手册页:

-u, --unique
不带 -c,仅输出相同运行中的第一个

答案3

(我假设您的输入是每行一个数字,因为这就是 sort 的输出。)

您可以尝试 awk:

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

这会给你一个未排序的列表(据我所知,在 awk 中遍历数组的顺序是未定义的),所以你必须再次按你的喜好排序。

答案4

$ 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

相关内容