有时候学习脚本,你会发现sort命令后面跟了一堆类似-k1,2,或者-k1.2 -k3.4的东东,有些匪夷所思。今天,我们就来搞定它—-k选项!

1 准备素材

[root@FDMdevBI opt]# cat testsort.txt
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500

第一个域是公司名称,第二个域是公司人数,第三个域是员工平均工资。(除了公司名称,其他的别信,都瞎写的^_^)

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

[root@FDMdevBI opt]# sort -t ' ' -k 1 testsort.txt
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500

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

3 我想让facebook.txt按照公司人数排序

[root@FDMdevBI opt]# sort -n -t ' ' -k 2 testsort.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000

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

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

[root@FDMdevBI opt]# sort -n -t ' ' -k2 -k3 testsort.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

看,我们加了一个-k2 -k3就解决了问题。对滴,sort支持这种设定,就是说设定域排序的优先级,先以第2个域进行排序,如果相同,再以第3个域进行排序。(如果你愿意,可以一直这么写下去,设定很多个排序优先级)

5 我想让facebook.txt按照员工工资降序排序,如果员工人数相同的,则按照公司人数升序排序:(这个有点难度喽)

[root@FDMdevBI opt]# sort -n -t ' ' -k3r -k2 testsort.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

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

[root@FDMdevBI opt]# sort -t ' ' -k3rn -k2n testsort.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

看,我们去掉了最前面的-n选项,而是将它加入到了每一个-k选项中了。

6 -k选项的具体语法格式

要继续往下深入的话,就不得不来点理论知识。你需要了解-k选项的语法格式,如下:

[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]

这个语法格式可以被其中的逗号(“,”)分为两大部分,Start部分和End部分。

先给你灌输一个思想,那就是“如果不设定End部分,那么就认为End被设定为行尾”。这个概念很重要的,但往往你不会重视它。

Start部分也由三部分组成,其中的Modifier部分就是我们之前说过的类似n和r的选项部分。我们重点说说Start部分的FStart和C.Start。

C.Start也是可以省略的,省略的话就表示从本域的开头部分开始。之前例子中的-k 2和-k 3就是省略了C.Start的例子喽。

FStart.CStart,其中FStart就是表示使用的域,而CStart则表示在FStart域中从第几个字符开始算“排序首字符”。

同理,在End部分中,你可以设定FEnd.CEnd,如果你省略.CEnd,则表示结尾到“域尾”,即本域的最后一个字符。或者,如果你将CEnd设定为0(零),也是表示结尾到“域尾”。

7 突发奇想,从公司英文名称的第二个字母开始进行排序:

[root@FDMdevBI opt]# sort -t ' ' -k1.2 testsort.txt
baidu 100 5000
sohu 100 4500
google 110 5000
guge 50 3000
[root@FDMdevBI opt]# sort -t ' ' -k1.3 testsort.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

看,我们使用了-k 1.2,这就表示对第一个域的第二个字符开始到本域的最后一个字符为止的字符串进行排序。你会发现baidu因为第二个字母是a而名列榜首。sohu和 google第二个字符都是o,但sohu的h在google的o前面,所以两者分别排在第二和第三。guge只能屈居第四了。

8 又突发奇想,,只针对公司英文名称的第二个字母进行排序,如果相同的按照员工工资进行降序排序:

[root@FDMdevBI opt]# sort -t ' ' -k1.2,1.2 -k3,3nr testsort.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

由于只对第二个字母进行排序,所以我们使用了-k 1.2,1.2的表示方式,表示我们“只”对第二个字母进行排序。(如果你问“我使用-k 1.2怎么不行?”,当然不行,因为你省略了End部分,这就意味着你将对从第二个字母起到本域最后一个字符为止的字符串进行排序)。对于员工工资进行排 序,我们也使用了-k 3,3,这是最准确的表述,表示我们“只”对本域进行排序,因为如果你省略了后面的3,就变成了我们“对第3个域开始到最后一个域位置的内容进行排序” 了。

9 在modifier部分还可以用到哪些选项?

可以用到b、d、f、i、n 或 r。

其中n和r你肯定已经很熟悉了。

b表示忽略本域的签到空白符号。

d表示对本域按照字典顺序排序(即,只考虑空白和字母)。

f表示对本域忽略大小写进行排序。

i表示忽略“不可打印字符”,只针对可打印字符进行排序。(有些ASCII就是不可打印字符,比如\a是报警,\b是退格,\n是换行,\r是回车等等)

10 思考思考关于-k和-u联合使用的例子:

[root@FDMdevBI opt]# cat testsort.txt
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500
[root@FDMdevBI opt]# sort -n -k2 testsort.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000
[root@FDMdevBI opt]# sort -n -k2 -u testsort.txt
guge 50 3000
baidu 100 5000
google 110 5000

当设定以公司员工域进行数值排序,然后加-u后,sohu一行就被删除了!原来-u只识别用-k设定的域,发现相同,就将后续相同的行都删除。

[root@FDMdevBI opt]# sort -k1 -u testsort.txt
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500
[root@FDMdevBI opt]# sort -k1.1,1.1 -u testsort.txt
baidu 100 5000
google 110 5000
sohu 100 4500

这个例子也同理,开头字符是g的guge就没有幸免于难。

[root@FDMdevBI opt]# sort -n -k2 -k3 -u testsort.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

咦!这里设置了两层排序优先级的情况下,使用-u就没有删除任何行。原来-u是会权衡所有-k选项,将都相同的才会删除,只要其中有一级不同都不会轻易删除的:)(不信,你可以自己加一行sina 100 4500试试看)

11 最诡异的排序:

[root@FDMdevBI opt]# sort -n -k2.2,3.1 testsort.txt
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000

以第二个域的第二个字符开始到第三个域的第一个字符结束的部分进行排序。

第一行,会提取0 3,第二行提取00 5,第三行提取00 4,第四行提取10 5。

又因为sort认为0小于00小于000小于0000….

因此0 3肯定是在第一个。10 5肯定是在最后一个。但为什么00 5却在00 4前面呢?(你可以自己做实验思考一下。)

答案揭晓:原来“跨域的设定是个假象”,sort只会比较第二个域的第二个字符到第二个域的最后一个字符的部分,而不会把第三个域的开头字符纳入比较范围。当发现00和00相同时,sort就会自动比较第一个域去了。当然baidu在sohu前面了。用一个范例即可证实:

[root@FDMdevBI opt]# sort -n -k2.2,3.1 -k1,1r testsort.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

12 有时候在sort命令后会看到+1 -2这些符号,这是什么东东?

关于这种语法,最新的sort是这么进行解释的:

On older systems, `sort’ supports an obsolete origin-zero syntax `+POS1 [-POS2]‘ for specifying sort keys.  POSIX 1003.1-2001 (*note Standards conformance::) does not allow this; use `-k’ instead.

原来,这种古老的表示方式已经被淘汰了,以后可以理直气壮的鄙视使用这种表示方法的脚本喽!

(为了防止古老脚本的存在,在这再说一下这种表示方法,加号表示Start部分,减号表示End部分。最最重要的一点是,这种方式方法是从0开始计数的,以前所说的第一个域,在此被表示为第0个域。以前的第2个字符,在此表示为第1个字符。明白?)

转载于:https://www.cnblogs.com/longjshz/p/5797933.html

Linux下的sort排序命令详解(二)相关推荐

  1. linux paste 变量,Linux下的paste合并命令详解

    paste单词意思是粘贴.该命令主要用来将多个文件的内容合并,与cut命令完成的功能刚好相反. 粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同.paste将按行将不同文件行信息放在一 ...

  2. linux电脑关机命令是什么问题,linux下正常关机之命令详解 -电脑资料

    系统启动的时候生成一个文件,正常关机的时候会删除这个文件,管理过程中出现故障的机率. 步骤: 在/etc/rc.d/init.d/下编程脚本. 判断是否正常关机,和生成文件的脚本:touch-file ...

  3. md0和md1linux软raid,linux下Raid及mdadm命令详解

    linux下Raid及mdadm命令详解 1.RAID级别:仅代表磁盘组织方式不同,没有高低之分: Raid常用种类:raid0,raid1,raid5,raid10,raid01 jbod:叠加硬盘 ...

  4. Linux下的压缩解压缩命令详解

    1.zip -r myfile.zip ./* 将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzip unzip -o -d /home ...

  5. linux fuser主机关闭,linux 下强制umount+Fuser命令详解

    fuser -km /soft umount /soft Linux命令Fuser详解 使用文件或者套节字来表示识别进程.我常用的他的两个功能:查看我需要的进程和我要杀死我查到的进程比如当你想umou ...

  6. linux下的arp刷新命令详解,linux arp 命令常用参数详解

    linux arp 命令常用参数详解 linux arp 命令常用参数详解 显示和修改地址解析协议(ARP)使用的"IP 到物理"地址转换表. ARP -s inet_addr e ...

  7. linux压缩命令讲解,Linux下的压缩解压缩命令详解

    linux zip命令 zip -r myfile.zip ./* 将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzip unzip - ...

  8. Linux下的tr编辑器命令详解

    通过使用 tr,您可以非常容易地实现 sed 的许多最基本功能.您可以将 tr 看作为 sed 的(极其)简化的变体:它可以用一个字符来替换另一个字符,或者可以完全除去一些字符.您也可以用它来除去重复 ...

  9. linux下route路由设置命令详解

    # route -n                                                  // 显示路由表,哪条在前就用哪条,都没有就用default # route a ...

最新文章

  1. 一个由跨平台产生的浮点数bug | 有你意想不到的结果
  2. dp线长什么样子_怎么样选择好的DP线?
  3. android 保存流媒体,Android实现使用流媒体播放远程mp3文件的方法
  4. NSMutableArray的一些知识
  5. Visual Studio 15.5预览版先睹为快
  6. 中国连计算机硬盘都无法生产吗,中国仍无能力制造出电脑中的硬盘
  7. c++ 读取访问权限冲突_Linux系统利用可执行文件的Capabilities实现权限提升
  8. linux 查看进程的信号,Linux 进程信号查看与控制
  9. 蒙特卡洛能解决啥_用蒙特卡洛方法解决“无法解决”的问题
  10. 【SparkStreaming学习之二】 SparkStreaming算子操作
  11. [译] 如何用ps制作泼水字
  12. 大数据之-Hadoop之HDFS_HDFS的优缺点---大数据之hadoop工作笔记0049
  13. 学习【阿里巴巴Java开发手册-嵩山版】
  14. 朱晔的互联网架构实践心得S1E5:不断耕耘的基础中间件
  15. stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)
  16. 2020年6月电子学会Python等级考试试卷(三级)考题解析
  17. 03-Qt应用程序关闭程序的时候出现QMutex: destroying locked mutex
  18. 如何利用文字推动业绩 ——营销人员的软文营销
  19. linux系统编程之管道(三):命名管道FIFO和mkfifo函数
  20. mongodb mysql配置_Mongodb 配置

热门文章

  1. [转载]jquery 消息插件--仿QQ消息弹出提醒
  2. shanghai road map and the operational time for 12306 system
  3. 一个高端大气上档次的壁纸网站,突破你的的审美
  4. swift operation
  5. 【转】6 个技巧,提升 C++11 的 vector 性能
  6. 【转】C#格式化字符串
  7. solaris 10 安装oracle 10g
  8. STM32之独立版USB(Host)驱动+MSC+Fatfs移植
  9. Centos 7 mysql Buffered warning: Changed limits: max_connections: 214 解决方法
  10. mongodb基础知识_3