按出现次数排序

时间:2015-03-10 21:33:32

标签: list shell sh

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

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

谢谢!

3 个答案:

答案 0 :(得分: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

    按出现次数以递减顺序按数字排序。

答案 1 :(得分:1)

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表示对第一个字段进行排序,数字,反向(即降序)排序。

答案 2 :(得分:1)

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

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

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

如果需要,可以使用/^[0-9]+/进行完全匹配;但是,当我们使用$0进行计数时,它并不重要。

相关问题