给出一个每行有一个元素的列表(偶尔有一些空白行),例如:
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
谢谢!
发布于 2015-03-10 14:10:15
您可以使用awk
和sort
。cnt使用列1 $1
中的数字作为索引。将++
1添加到每行数组索引$1的值中。管道(|
)到sort
。sort
第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
进行计数,所以在这里并不重要。
发布于 2015-03-10 13:48:21
按次数排序的数字:
$ 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
按出现次数按下降顺序进行数字排序。发布于 2015-03-10 13:50:11
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
意味着对第一个字段进行排序,从数字上讲,按反向(即降序)排序。
https://stackoverflow.com/questions/28974491
复制