linux centos7 sort命令的学习与训练

sort命令的功能是对文件中的各行进行排序。sort命令有许多非常实用的选项,这些选项最初是用来对数据库格式的文件内容进行各种排序操作的。实际上,sort命令可以被认为是一个非常强大的数据管理工具,用来管理内容类似数据库记录的文件。

sort排序是根据从输入行抽取的一个或多个关键字进行比较来完成的。排序关键字定义了用来排序的最小的字符序列。

在各类编程语言中,排序是一项避不开的话题。可以说都有sort这项操作、功能或命令。

linux生产环境中,sort命令常用于对统计日志中不同服务错误的数量进行排序。

一、sort的工作原理

sort将文件的每一行作为一个单位,相互比较,默认比较规则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

sort命令将逐行对文件中的内容进行排序,如果两行的首字符相同,该命令将继续比较这两行的下一字符,如果还相同,将继续进行比较。

更多情况下,sort读取每一行后按照指定的分隔符将每一行划分成多个字段,这些字段就是sort排序的对象。同时,sort可以指定按照何种排序规则进行排序,如按照当前字符集排序规则(这是默认排序规则)、按照字典排序规则、按照数值排序规则、按照月份排序规则、按照文件大小格式(k<M<G)。还可以去除重复行,指定降序或升序(默认)的排序方式。

默认的排序规则为字符集排序规则,通常几种常见字符的顺序为:"空字符串<空白字符<数值<a<A<b<B<...<z<Z",字典排序规则也如此。

语法:

        sort  [选项]  文件

说明:sort命令对指定文件中所有的行进行排序,并将结果显示在标准输出上。如不指定输入文件或使用“- ”,则表示排序内容来自标准输入。

二、常用排序

1、默认排序

a.排序时,默认是按每行/每个域的首字符排序,数字的优先级要大于字符的优先级;字符的优先级大于中文的优先级

b.缺省情况下以整行为关键字按ASCII字符顺序进行排序

c.不指定升序还是降序时,默认是升序

d.有多个域时,默认根据第1个域对数据记录进行排序,也可以用-k选项指定某个域进行排序。sort命令用1表示第1个域,用2表示第2个域,以此类推。

2、指定排序

a.不指定排序要求

        cat filename |sort

        sort filename

两种写法功能相同,效果一样。

b.按数值排序

在前面简单应用的基础上,加上选项-n。

        cat filename |sort -n

        sort -n filename

c.按中文拼音排序

bash仅支持按拼音对中文排序,不能按笔画排序。

其他软件可以支持中文按笔画排序,但需下载安装。

d.按指定分隔符指定域排序

这类排序应用比较多,也是最复杂的情况。主要是在sort命令中添加-t和-k选项。

3、反向排序

sort 的-r选项,是按照倒序输出,最终效果是倒序排序。

原理在于:先按要求排序,再反向输出!

虽然选项可以调整位置,写在前写在后,连接写,单独写,均可。但排序原则是:

-r  先默认排序,再反向输出

-nr 先按数字排序再反向输出

注意:"-r"不参与排序动作,只是操作排序完成后的结果

4、多列排序

一个文本文件是按行分隔,有多项记录。而每行又可以按指定分隔符分隔成多个域(有时称为字段、列)。多列排序主要是应用sort的-t选项和-k选项。

-t指定分隔符(或称间隔符)

默认分隔符是空格。可以通过-t":"指定其他分隔符。-t与":"之间可有可无空格;分隔符可加可不加""(当然也可用单引号''或不用'')。

常用分隔符有空格" "、冒号":"、分号";"、@#$\等等。

对于特殊符号(如制表符),可使用类似于-t $'\t'或-t 'ctrl+v,tab'(先按ctrl+v,然后按tab键)的方法实现。

-k用来指定列数

-k 选项的语法如下:

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

这个语法格式包含两大部分,以逗号(,)分割为Start和End两部分;如果不设置End部分,那么就认为End被设定为行尾!

Start部分由三部分组成:

FStart指定以哪个部分排序,1就是以第一部分排序

CStart指定从指定部分的第几个字符开始排序

Modifier指定排序方式可以使用r、n等选项

5.排序其他排序功能

a.去重

sort的-u选项

        -u的作用就是在输出行中去重复

b.忽略大小写

sort常用选项

        -f会将小写字母都转换为大写字母来进行比较,亦即忽略大小写

c.检查文件与合并文件

-c会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1

-C会检查文件是否已排好序,如果乱序,不输出内容,仅返回1

-m 合并已排序的多个文件为一个文件

d.修改原文件

sort的-o选项

正常将sort的执行结果重定向到源文件会使源文件变为空。

但是加上-o就可以将排序后的结果重定向到源文件

三、实训案例

1. 不加任何选项排序

先准备训练素材:(各字符间用空格分隔)

cat  sort1.txt

xiaoli 25 2388

wangyuan 20 2388

xiaozi 25 3406

xiaohong 25 2387

xiaozi 25 3407

zhangyishan 24 5678

wangyuan 20 2386

guosan 25 3409

liyang 25 2385

wangyuan 20 2389

guosan 25 3405

liyang 25 2382

chensan 25 3402

liyang 25 2381

chensan 25 3404

执行sort命令:

        sort sort1.txt

由结果可知,排序结果按第一列进行升序排列。

2. 按第2列数值降序排序

选项-k2nr  其中k按指定列(域)排序,2指第2列,n指按数据排序,r指反向显示。

不设置分隔符,是按默认分隔符(空格)。

3.指定分隔符再排序

先准备以制表符分隔的文本素材sort2.txt

修改sort1.txt:sed 's/ /\t/g' sort1.txt >sort2.txt

查看一下修改效果:

指定制表符这种无法直接输入的特殊字符的方式是$'\t'。

4.多列排序与多项排序

编辑以分隔符.分隔的文本素材sort3.txt

192.168.3.1 00:0F:AF:81:19:1F

192.168.3.2 00:0F:AF:85:6C:25

192.168.3.3 00:0F:AF:85:70:42

192.168.2.20 00:0F:AF:85:55:DE

192.168.2.21 00:0F:AF:85:6C:09

192.168.2.22 00:0F:AF:85:5C:41

192.168.0.151 00:0F:AF:85:6C:F6

192.168.0.152 00:0F:AF:83:1F:65

192.168.0.153 00:0F:AF:85:70:03

192.168.1.10 00:30:15:A2:3B:B6

192.168.1.11 00:30:15:A3:23:B7

192.168.1.12 00:30:15:A2:3A:A1

192.168.1.1 00:0F:AF:81:19:1F

192.168.2.2 00:0F:AF:85:6C:25

192.168.3.3 00:0F:AF:85:70:42

192.168.2.22 00:0F:AF:85:5C:41

192.168.1.152 00:0F:AF:83:1F:65

192.168.0.153 CA:0F:AF:85:70:03

192.168.3.10 00:30:15:A2:3B:B6

192.168.1.11 00:30:15:A3:23:B7

192.168.3.12 00:30:15:A2:3A:A1

案例目标:按网段降序排序,相同时再按IP第4位升序排序。

分析素材:每行由几部分组成:前几位是IP地址,后面几位是MAC地址。

IP地址由.分隔四位数字,MAC地址由:分隔六位十六制数字,IP地址与MAC地址由空格分隔。

本案例设置-t.分隔符,对第3列和第4列分别排序。

按数值排序,用-n选项;降序用-r选项。进行两项排序时,可以设置两个-k选项,分别设置排序选项。

        sort -n -t. -k3,3r -k4,4.3 sort3.txt

        sort -n -u -t. -k3.3r -k4.1,4.3 sort3.txt

-k3,3从第三个字段开始排序,到第三个字段结束。

-k4,4.3从第四个字段的第一个字符开始排序,到第四个字段的第三个字符结束。

重点理解:逗点.后面紧跟的数字,在其中的这个含义:从逗点.前面数字所在域的第几个字符,开始。

-k 3.3 意思就是,从第3个域的第三个字符开始;同理 -k 4.1 就是从第4个域的第一个字符开始。

总结说明:

.是某个段的第几个字符。

,号前面默认是第一个字符,后面默认是到结尾,“,”是分隔字段的。

5.特殊事项

a.-t分隔符不能设置多个分隔符,就是一会只能设置一个分隔符。不象其他命令,如awk,可以设置多个分隔符。

b.如果文本文件中,空格处有多个空格,会影响-t的作用。需要提前处理。或者用tr –s ' ',或者用-b选项。

小结

sort命令是Linux系统一种排序工具,它将输入文件看作由多条记录组成的数据流,而记录由可变宽度的字段组成,以换行符为定界符。sort命令与awk类似,可将记录分成多个域来处理,默认的域分隔符是空格符,域分隔符也可由用户指定。

主要了解:sort命令的-r  -f选项

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/80963.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT通过ODBC连接GBase 8s数据库(Windows)示例

示例环境&#xff1a; 操作系统&#xff1a;Windows 10 64位数据库及CSDK版本&#xff1a;GBase 8s V8.8_3.0.0_1 64位QT&#xff1a;5.12.0 64位 1&#xff0c;CSDK安装及ODBC配置 1.1&#xff0c;免安装版CSDK 下载免安装版的CSDK驱动&#xff0c;地址&#xff1a;https:…

企业如何做好实施数字工厂管理系统前的需求分析

随着工业4.0的到来&#xff0c;数字工厂系统解决方案已经成为企业提高生产效率、优化资源配置和提升产品质量的重要工具。在考虑实施数字工厂管理系统之前&#xff0c;企业需要进行详细的需求分析&#xff0c;以确保系统的实施能够真正满足企业的业务需求。本文将探讨企业如何做…

Python(八十六)字符串的编码与解码

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

阿里云容器镜像服务ACR(Alibaba Cloud Container Registry)推送镜像全过程及总结

前提&#xff1a;安装配置好docker&#xff0c;可参考我这篇 基于CentOS7安装配置docker与docker-compose。 一、设置访问凭证 1.1 容器镜像服务ACR 登录进入阿里云首页&#xff0c;点击 产品-容器-容器镜像服务ACR 点击管理控制台 1.2 进入控制台-点击实例列表 个人容器…

生物医学翻译,选择专业翻译公司有何优势

我们知道&#xff0c;生物医学翻译是基于生物医学等相关行业的翻译服务&#xff0c;具有较强的专业性和复杂性&#xff0c;为了确保生物医学翻译的质量&#xff0c;务必选择专业的翻译公司。那么&#xff0c;专业翻译公司有何优势&#xff0c;北京生物医学翻译哪家好&#xff1…

【应用层】网络基础 -- HTTP协议

再谈协议HTTP协议认识URLurlencode和urldecodeHTTP协议格式HTTP的方法HTTP的状态码HTTP常见HeaderHTTP周边会话保持 再谈协议 协议是一种 “约定”. socket api的接口&#xff0c;在读写数据时&#xff0c;都是按 “字符串” 的方式来发送接收的(tcp是以字节流的方式发送的&am…

Java“牵手”天猫商品评论API接口数据,天猫API接口申请指南

天猫商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取淘宝商品详情页面评价内容数据&#xff0c;您可以通过开放平台的接口或者直接访问淘宝商城的网页来获取商品详情信息内的评论数据。以下是两种常用方法…

No mapping found for HTTP request with URI

参考: 参考地址 说明 ssm老项目,接过来别人的项目 临时建了一个Controller方便测试用的,结果访问掉不通,报: No mapping found for HTTP request with URIxxxx 这样的错误 解决办法 看了下web,xml配置 在 webmvc-config.xml 配置文件里面添加了几行配置 说明: com.iph.h…

UE4与pycharm联合仿真的调试问题及一些仿真经验

文章目录 ue4与pycharm联合仿真的调试问题前言ue4端的debug过程pycharm端 一些仿真经验小结 ue4与pycharm联合仿真的调试问题 前言 因为在实验中我需要用到py代码输出控制信息给到ue4中&#xff0c;并且希望看到py端和ue端分别在运行过程中的输出以及debug调试。所以&#xf…

手机锁屏密码忘了怎么解开?4个方法,帮你解锁!

“最近新买了一部手机&#xff0c;为了保护隐私我还特意设置了密码。明明之前一直都记得&#xff0c;但昨天手机没电后重新开机&#xff0c;就怎么也想不起手机的锁屏密码了&#xff0c;有什么方法可以解决这个问题吗&#xff1f;” 随着手机在日常生活中的普及&#xff0c;手机…

gdb 条件断点

条件断点&#xff0c;顾名思义就是有条件才会触发的断点&#xff0c;一般设置此类断点形如&#xff1a;b xxx if xxx&#xff0c;如&#xff1a; 要触发此断点则需要 is_created 0。打完断点我们也可以用 info b 查看一下当前已经设置的断点信息&#xff0c;如&#xff1a; 断…

Redis数据结构之String

String 类型是 Redis 的最基本的数据类型&#xff0c;一个 key 对应一个 value&#xff0c;可以理解成与Memcached一模一样的类型。 String 类型是二进制安全的&#xff0c;意思是 Redis 的 String 可以包含任何数据&#xff0c;比如图片或者序列化的对象&#xff0c;一个 Redi…