按出现次数对行排序

Order lines by number of occurrences

给定一个每行一个元素的列表(偶尔有一些空行),例如:

22008
6881
6881
22008

6881
22008
22008
6881

56515
8080
8080
56515

22008
45682
45682
22008

我想得到一个列表作为输出,其中包含按出现次数排序的唯一项目:

22008 - 6
6881 - 4
8080 - 2
45682 - 2
56515 - 2

谢谢!

按出现次数排序的数字:

$ grep -vE '^$' file | sort | uniq -c | sort -rn
      6 22008
      4 6881
      2 8080
      2 56515
      2 45682

工作原理

  • grep -vE '^$' file

    从文件中删除空行

  • sort | uniq -c

    对数字进行排序,然后打印唯一的数字及其出现次数。

  • sort -rn

    按出现次数降序排列。

uniq 命令有一个选项 -c 来发出它找到的连续出现的次数。解决方案是首先删除空行和 sort 输入到 uniq -c 的列表,然后 sort 第一个字段的输出,其中包含出现次数。

sed '/^\s*$/d' | sort | uniq -c | sort -k1nr 的输出是

   6 22008
   4 6881
   2 45682
   2 56515
   2 8080

请注意最后 sort 的选项:-k1nr 表示在第一个字段上按数字倒序(即降序)排序。

您可以使用 awksort。 cnt 使用您在第 1 列 </code> 中的数字作为索引。将 <code>++ 1 添加到每一行的数组索引 $1 的值。管道 (|) 到 sortsort 第 2 列 (-k2) 反向 (-r)

awk '/[0-9]/ {cnt[]++}END{for(k in cnt) print k,"- " cnt[k]}' file.txt |sort -rk2

如果您删除 /[0-9]/,您还将获得空行数作为奖励:)。

如果你愿意,可以用/^[0-9]+/做全匹配;但是,因为我们使用 [=22=] 进行计数,所以这里并不重要。