首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >按发生次数排序行

按发生次数排序行
EN

Stack Overflow用户
提问于 2015-03-10 21:33:32
回答 3查看 112关注 0票数 1

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

代码语言:javascript
代码运行次数:0
运行
复制
22008
6881
6881
22008

6881
22008
22008
6881

56515
8080
8080
56515

22008
45682
45682
22008

作为输出,我希望获得一个列表,其中包含按事件次数排序的唯一项:

代码语言:javascript
代码运行次数:0
运行
复制
22008 - 6
6881 - 4
8080 - 2
45682 - 2
56515 - 2

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-10 22:10:15

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

代码语言:javascript
代码运行次数:0
运行
复制
awk '/[0-9]/ {cnt[$1]++}END{for(k in cnt) print k,"- " cnt[k]}' file.txt |sort -rk2

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

如果您愿意,可以使用/^[0-9]+/进行完全匹配;但是,由于我们使用$0进行计数,所以在这里并不重要。

票数 1
EN

Stack Overflow用户

发布于 2015-03-10 21:48:21

按次数排序的数字:

代码语言:javascript
代码运行次数:0
运行
复制
$ 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 按出现次数按下降顺序进行数字排序。
票数 2
EN

Stack Overflow用户

发布于 2015-03-10 21:50:11

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

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

代码语言:javascript
代码运行次数:0
运行
复制
   6 22008
   4 6881
   2 45682
   2 56515
   2 8080

注意结尾处的sort选项:-k1nr意味着对第一个字段进行排序,从数字上讲,按反向(即降序)排序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28974491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档