给出一个列表,每行一个元素(偶尔会有一些空行),例如:
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
谢谢!
答案 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)
您可以使用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
进行计数时,它并不重要。