Linux技巧(二):Linux sort命令深入解析

您所在的位置:网站首页 数字大小单位字母 Linux技巧(二):Linux sort命令深入解析

Linux技巧(二):Linux sort命令深入解析

2024-06-15 19:27| 来源: 网络整理| 查看: 265

前言

目的:逐步带你了解sort排序,解开-k参数的困惑。

困惑之处:sort -k 1.2,1.2

1.2是什么意思?1.2,1.2又是什么鬼?为什么sort -k 1.2和sort -k 1.2,1.2的排序结果不一致?

本文带你逐步解析。

一、sort语法、参数、及其注意事项 1、语法

语法:

sort [-bcdfimMnr][-o][-t][+-][--help][--verison][文件]

2、参数 

 参数:

-b 忽略每行前面开始出的空格字符。从第一个可见字符开始比较。

-d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。

-f 排序时,忽略字符大小写.

-i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。

-c 检查文件是否已经按照顺序排序。

-m 将几个排序好的文件进行合并。

-M 前面3个字母依照月份的缩写进行排序。

-n 依照数值的大小排序。

-o 将排序后的结果存入指定的文件。

-r 降序排列(默认是升序)。

-t 指定排序时所用的栏位分隔字符。

-k field1[,field2] 按指定的列进行排序。

-u 排序后相同的行只显示一次(默认按整行进行比较)

--help 显示帮助。

--version 显示版本信息。

3、注意事项 

1、排序时,默认是按每行/每个域的首字符排序,数字的优先级要大于字符的优先级

2、不指定升序还是降序时,默认是升序

4、重点难点

重点掌握:-t -n -o  -u  - k,尤其是-k。

其他的参数相对比较容易掌握。 

二、案例数据准备 #vim salary.txt 编辑测试文件数据(工资表,里面的数据是虚拟的)

google 110 5000 baidu 100 5000 guge 50 3000 sohu 100 4500 sohu 30 1500

#vim tt.txt

dell 100 10020 ee lenovo 200 12202 a huawei 500 13004 ff cisco 300 24005 bb

#cp tt.txt t.txt #vim t.txt

随意在里面添加一些空格,便于暴露出了-t的不足之处。 

dell 100   10020 ee lenovo 200     12202   a huawei 500     13004   ff cisco 300     24005            bb

三、通过案例,由浅入深了解sort 1、-r 指定排序 #sort salary.txt 默认根据首行的首字母,升序排列 #sort -r salary.txt 按首行的首字母,降序排列

 

注:此时,暂不涉及复杂的排序,你想要的排序在-t、-k 这些高级参数里面(先了解-r参数为主)。  

2、-t 指定分隔符,并用-k 指定按哪个域进行排序 1.-t 用空格做分隔符的注意事项

-t 如果需要用空格作为分隔符,-t ' ' 和 -t " " 效果是一样的(引号中间,只能有1个空格!)

sort -t ' ' -k 4 tt.txt 以空格为分隔符,按第4个域进行排列(答案:符合预期) sort -t ' ' -k 4 t.txt 以空格为分隔符,按第4个域进行排列(答案:不符预期)

 注:在准备工作中,tt.txt中的数据是规则的,彼此之间只有1个空格; t.txt中的数据是不规则的,彼此之间空格随机。

到此得出结论:-t ‘ ’直接处理不规则的文本格式,是难以胜任的,如果一定要这么做,需要对文件预处理一遍,达到-t的使用场景。

当然,如果-t 用其他特殊字符时(如冒号:),比空格会要好用一些。

2.-t 常用组合 -k 和 -n (同时指定多个域进行排序)

题目:在salary中,按薪水进行降序排列,薪资相同时,按公司人数升序排列。 

sort -t' ' -n -k 3r -k 2 salary.txt

 注:-n是全局参数,所有指定的域都有效(按数值排序);3r中的紧跟这数字的r是局部参数,仅对-k 3r中r前面的数字所对应的第3个域有效。后面的 -k 2 没有指定降序,那么默认第2个域就是升序排列的。

3、-o把结果输出到指定文件

在sort排序中,如果用 > 重定向来把结果输出到源文件,源文件会被置为空。

此时,-o的作用就凸显出来了。

#cp salary.txt s.txt 复制一份测试数据 #sort -t' ' -k 3r s.txt -o s.txt 排序后,内容用-o输出回原文件 #cat s.txt 发现内容重新按工资高低排序了 #sort -t' ' -k 3 s.txt > s.txt 排序后,内容重定向回原文件 #cat s.txt 发现内容被清空了

 

 实验结果表明:如果要把排序的结果回写到源文件,需要用-o参数,不能用重定向。

4、-n按数值大小排序(重点)

sort在实际排序过程中: 如果不用参数-n,则会把数字当做字符来排序 出现10



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3