前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shell五分钟系列之sort

shell五分钟系列之sort

作者头像
程序员小王
发布2023-03-28 09:10:49
3450
发布2023-03-28 09:10:49
举报
文章被收录于专栏:架构说架构说

第二节:sort

小练习

192. 统计词频

写一个 bash 脚本以统计一个文本文件 words.txt 中每个单词出现的频率

示例:

假设 words.txt 内容如下:

代码语言:javascript
复制
the day is sunny the the
the sunny is is

你的脚本应当输出(以词频降序排列):

代码语言:javascript
复制
the 4
is 3
sunny 2
day 1

答案:

awk ‘{for(i=1;i<=NF;i++) a[$i]++} END{for(i in a) print i,a[i]}’ words.txt |sort -k2nr

解析

sort - sort lines of text files

sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,

最后将他们按升序输出。

-r, —reverse reverse the result of comparisons

sort默认的排序方式是升序,如果想改成降序,就加个-r

-t, —field-separator=SEP use SEP instead of non-blank to blank transition

间隔符 默认是空格

-n, —numeric-sort compare according to string numerical value

你有没有遇到过10比2小的情况,使用-n选项,来告诉sort,“要以数值来排序”

-k, —key=POS1[,POS2] start a key at POS1 (origin 1), end it at POS2 (default end of line)

多列排序

---------------end-----------------

扩展阅读

一、准备素材

第一个域是公司名称,第二个域是公司人数,第三个域是员工平均工资。

代码语言:javascript
复制
$ cat duweixin.net.txt
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500

二、 我想让这个文件按公司的字母顺序排序,也就是按第一个域进行排序:(这个duweixin.net.txt文件有三个域)

代码语言:javascript
复制
$ sort -t ‘ ‘ -k 1 duweixin.net.txt
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500

就直接用-k 1设定就可以了。(其实此处并不严格,稍后你就会知道)

三、我想让duweixin.net.txt按照公司人数排序

代码语言:javascript
复制
$ sort -n -t ‘ ‘ -k 2 duweixin.net.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000

但是,此处出现了问题,那就是baidu和sohu的公司人数相同,都是100人,这个时候怎么办呢?按照默认规矩,是从第一个域开始进行升序排序,因此baidu排在了sohu前面。

四、我想让facebook.txt按照公司人数排序 ,人数相同的按照员工平均工资升序排序:

代码语言:javascript
复制
$ sort -n -t ‘ ‘ -k 2 -k 3 duweixin.net.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

加了一个-k2 -k3就解决了问题。对滴,sort支持这种设定,就是说设定域排序的优先级,先以第2个域进行排序,如果相同,再以第3个域进行排序。

五、我想让facebook.txt按照员工工资降序排序,如果员工人数相同的,则按照公司人数升序排序

代码语言:javascript
复制
$ sort -n -t ‘ ‘ -k 3r -k 2 duweixin.net.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

此处有使用了一些小技巧,你仔细看看,在-k 3后面偷偷加上了一个小写字母r。你想想,再结合我们上一篇文章,能得到答案么?揭晓:r和-r选项的作用是一样的,就是表示逆序。因为sort默认是按照升序排序的,所以此处需要加上r表示第三个域(员工平均工资)是按照降序排序。此处你还可以加上n,就表示对这个域进行排序时,要按照数值大小进行排序,举个例子吧:

代码语言:javascript
复制
$ sort -t ‘ ‘ -k 3nr -k 2n duweixin.net.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Offer多多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第二节:sort
    • 小练习
      • 解析
        • 扩展阅读
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档