当前位置: 首页 > news >正文

Linux 常用命令 - sort 【对文件内容进行排序】

简介

sort 命令源于英文单词 “sort”,表示排序。其主要功能是对文本文件中的行进行排序。它可以根据字母、数字、特定字段等不同的标准进行排序。sort 通过逐行读取文件(没有指定文件或指定文件为 - 时读取标准输入)内容,并按照指定的排序规则对行进行排序,最后输出排序后的结果。

使用方式

sort [OPTION]... [FILE]...
sort [OPTION]... --files0-from=F

排序相关选项

  • -b, --ignore-leading-blanks:忽略行首的空白字符。

  • -d, --dictionary-order:使用字典顺序排序(只考虑空白字符和字母及数字字符)。

  • -f, --ignore-case:排序时忽略字母的大小写(将小写字母作为大写字母看待)。

  • -g, --general-numeric-sort:按照通用数值进行排序。

  • -i, --ignore-nonprinting:排序时忽略不可打印的字符。

  • -M, --month-sort:按照月份缩写进行排序( (unknown) < ‘JAN’ < … < ‘DEC’)。

  • -h, --human-numeric-sort:按照便于阅读的数值排序,例如 2K 1G

  • -n, --numeric-sort:按照简单的数值进行排序。

  • -R, --random-sort:随机排序,类似于洗牌。但具有相同内容的行会被保持在一起。

  • --random-source=FILE:指定 FILE 文件为随机数生成源供随机排序使用。

  • -r, --reverse:反转排序结果,即倒序排列。

  • --sort=WORD:根据 WORD 的内容进行排序,其中 WORD 包含:general-numeric -g, human-numeric -h, month -M, numeric -n, random -R, version -V

  • -V, --version-sort:按照版本号的自然顺序进行排序。

其他选项

  • --batch-size=NMERGE:指定一次性合并文件或处理数据时的最大数量,超过的数量会使用临时文件。
  • -c, --check, --check=diagnose-first:检查输入数据是否已经排序(该操作不会进行排序)。
  • -C, --check=quiet, --check=silent:同 -c,但在发现未排序的行时不会输出提示信息,仅以一个错误码退出来指示未排序状态。
  • --compress-program=PROG:指定外部压缩程序 PROG 来对临时文件进行压缩。使用 PROG -d 来解压缩。
  • --debug:使用特殊的标记注释用于排序的行,并且对于一些可能的问题输出警告信息到 stderr 。可以帮助理解排序规则。
  • --files0-from=F:从文件 F 中读取以 NUL 结尾的所有文件名称来进行排序;如果 F- ,那么从标准输入中读取文件名。
  • -k, --key=KEYDEF:通过指定一个 key 来进行排序;通常后面跟 KEYDEF 参数(下文有描述)用来指定排序键的详细信息。
  • -m, --merge:合并已经排序的文件(不会进行排序)。
  • -o, --output=FILE:将排序结果写入指定的输出文件 FILE ,而不是打印到标准输出中。
  • -s, --stable:通过禁用最后的比较来进行稳定排序。
  • -S, --buffer-size=SIZE:指定排序操作可以使用的最大内存大小,超过该值会使用临时文件存储额外的数据。
  • -t, --field-separator=SEP:指定字段的分隔符为 SEP
  • -T, --temporary-directory=DIR:指定 DIR 为临时文件目录来替代默认的 $TMPDIR/tmp;多次使用该选项指定多个临时目录。
  • --parallel=N:指定 sort 命令在执行排序时可以使用的最大并行运行数量。
  • -u, --unique:该选项与 -c 共同使用时表示检查文件是否按照严格顺序排序。严格顺序指不仅每行相对于前一行按照指定顺序排列,还不能有重复行。不与 -c 使用时则会在排序后去除重复行。
  • -z, --zero-terminated:指定以零字符( NULL 字符,\0)替代默认的换行符(\n)作为记录分隔符。
  • --help:显示帮助信息。
  • --version:显示版本信息。

KEYDEF

-k 选项后一般会跟一个 KEYDEF 参数,该参数用于定义排序时的起始位置和停止位置。以及可能覆盖全局排序选项的字段和特定的排序选项。

其格式为 F[.C][OPTS][,F[.C][OPTS]]

其中 F 为字段(列)号,表示参与排序的字段(列)(从 1 开始计数)。

C 表示字段内字符的位置(从 1 开始计数),可选,如果指定了 C 则排序会从字段的第 C 个字符开始。

OPTS 是一个或多个单字母排序选项(如 bdfgiMhnRrV),这些参数可以覆盖全局的排序选项。

第二个 F[.C][OPTS] 也是可选的,用于指定排序键的结束位置。如果未指定结束位置,则默认以行尾为结束。

在使用该参数进行复杂排序的时候,可以借助于 --debug 来调试排序行为,从而验证自己的排序语法是否正确。

参考示例

1. 对指定文件进行默认排序

sort test.txt

首先使用 cat 命令查看 test.txt 中的内容,可以发现其每行内容是乱序分布的,接着使用 sort 命令对该文件内容进行排序,最后输出每行按照字母顺序排列的结果:

jay@jaylinuxlenovo:~/test$ cat test.txt 
aaaa
cccc
ffff
eeee
bbbb
aaaa
jay@jaylinuxlenovo:~/test$ sort test.txt 
aaaa
aaaa
bbbb
cccc
eeee
ffff

2. 对指定文件进行默认排序,但忽略相同行

sort -u test.txt 

如果文件内容中存在相同的行,则可以使用 -u 选项删除重复内容,只保留唯一的行。可以看到对例一中的文件使用 -u 排序后,原来结果中存在的两行 aaaa 只剩下了一行:

jay@jaylinuxlenovo:~/test$ sort -u test.txt 
aaaa
bbbb
cccc
eeee
ffff

3. 对指定文件进行简单的数值排序

sort -n test.txt 

如果文件内容中包含普通的数字,并且需要按数值的大小进行排序,则需要用到 -n 选项。通过本例的演示可以看出,如果不使用该选项,则排序结果是按照 ASCII 码的值排序,但这样得到的结果并不是我们想要的,而使用了 -n 后,才是真正按数值的大小进行排列的结果:

jay@jaylinuxlenovo:~/test$ cat test.txt #原内容
12
103
45
1
235
79
66jay@jaylinuxlenovo:~/test$ sort test.txt # 普通排序
1
103 #这里按照 ASCII 值排序,明显不是我们想要的
12
235
45
66
79
jay@jaylinuxlenovo:~/test$ sort -n test.txt # 数值排序
1
12
45
66
79
103
235

4. 反转数值排序的结果(使用降序排序)

sort -rn test.txt

sort 默认是升序排列,即先小后大,使用 -r 选项可以反转为降序排列,即从大到小:

jay@jaylinuxlenovo:~/test$ sort -rn test.txt 
235
103
79
66
45
12
1

5.使用指定的排序模式进行排序

sort -nk 2 -t : test.txt 

首先使用 cat 命令确认 test.txt 中的内容,然后使用 -n 指定用数值排序,-k 2 指定基于第二列进行排序,-t : 指定列分隔符为 :

jay@jaylinuxlenovo:~/test$ cat test.txt 
banana:10:香蕉
apple:30:苹果
orange:8:橙子
pear:25:梨子
cherry:60:樱桃
watermelon:27:西瓜
jay@jaylinuxlenovo:~/test$ sort -nk 2 -t : test.txt 
orange:8:橙子
banana:10:香蕉
pear:25:梨子
watermelon:27:西瓜
apple:30:苹果
cherry:60:樱桃

注意事项

  • 默认情况下,sort 命令是按照字符的 ASCII 值进行排序的。这意味着如果排序内容包含数字,它们会按照字母顺序而不是数值进行排序,这可能导致排序结果与实际不符。例如 10 会排在 2 前面。因此如果想要按照实际的数值排序,需要使用 -g 选项。

  • 默认情况下,sort 会按照升序排列,即从小到大、从 AZ。也可以通过 -r 选项进行从大到小的降序排列。

  • sort-n-g 选项都能用于数值排序,但 -n 选项只能识别一些简单数值形式,如整数、浮点数等。而 -g 选项则能处理更广泛的数值表示形式,如科学计数法。其在解析复杂数值格式方面更为健壮。但在处理简单的数字时可能没有 -n 的效率高。

  • 默认情况下 -R 选项会使用系统内部生成的随机种子,而 --random-source=FILE 允许用户指定一个文件作为随机数生成的源,即随机种子文件。这个选项与 -R 结合使用时可以控制随机排序的结果,如果两次随机排序指定了同一个文件并且文件内容没有变,则随机排序结果也是相同的。需要注意的是如果该文件包含的内容长度不够时会报错。

  • -c-C 选项都用于检测输入数据是否经过排序,如果检测到是排序后的数据,则不会输出任何信息并且以 0 状态码退出。不同的是,如果遇到未排序的数据,-c 会输出第一个未排序行的信息,并以非零错误码退出,而 -C 不会输出任何信息,仅以一个非零错误码退出来指示未排序状态。

  • sort 命令的排序顺序会受到系统区域设置(locale)的影响。为了确保排序结果的一致性,可以通过设置 LC_ALL=C 来强制使用传统的字节值排序。

相关文章:

Linux 常用命令 - sort 【对文件内容进行排序】

简介 sort 命令源于英文单词 “sort”&#xff0c;表示排序。其主要功能是对文本文件中的行进行排序。它可以根据字母、数字、特定字段等不同的标准进行排序。sort 通过逐行读取文件&#xff08;没有指定文件或指定文件为 - 时读取标准输入&#xff09;内容&#xff0c;并按照…...

MyBatis最佳实践:提升数据库交互效率的秘密武器

第一章&#xff1a;框架的概述&#xff1a; MyBatis 框架的概述&#xff1a; MyBatis 是一个优秀的基于 Java 的持久框架&#xff0c;内部对 JDBC 做了封装&#xff0c;使开发者只需要关注 SQL 语句&#xff0c;而不关注 JDBC 的代码&#xff0c;使开发变得更加的简单MyBatis 通…...

选择困难?直接生成pynput快捷键字符串

from pynput import keyboard# 文档&#xff1a;https://pynput.readthedocs.io/en/latest/keyboard.html#monitoring-the-keyboard # 博客(pynput相关源码)&#xff1a;https://blog.csdn.net/qq_39124701/article/details/145230331 # 虚拟键码(十六进制)&#xff1a;https:/…...

DeepSeek-R1:强化学习驱动的推理模型

1月20日晚&#xff0c;DeepSeek正式发布了全新的推理模型DeepSeek-R1&#xff0c;引起了人工智能领域的广泛关注。该模型在数学、代码生成等高复杂度任务上表现出色&#xff0c;性能对标OpenAI的o1正式版。同时&#xff0c;DeepSeek宣布将DeepSeek-R1以及相关技术报告全面开源。…...

国内优秀的FPGA设计公司主要分布在哪些城市?

近年来&#xff0c;国内FPGA行业发展迅速&#xff0c;随着5G通信、人工智能、大数据等新兴技术的崛起&#xff0c;FPGA设计企业的需求也迎来了爆发式增长。很多技术人才在求职时都会考虑城市的行业分布和发展潜力。因此&#xff0c;国内优秀的FPGA设计公司主要分布在哪些城市&a…...

3.日常英语笔记

screening discrepancies 筛选差异 The team found some screening discrepancies in the data. 团队在数据筛选中发现了些差异。 Don’t tug at it ,or it will fall over and crush you. tug 拉&#xff0c;拽&#xff0c;拖 He tugged the door open with all his might…...

基于RIP的MGRE实验

实验拓扑 实验要求 按照图示配置IP地址配置静态路由协议&#xff0c;搞通公网配置MGRE VPNNHRP的配置配置RIP路由协议来传递两端私网路由测试全网通 实验配置 1、配置IP地址 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 15.0.0.1 24 [R1]int LoopBack 0 [R1-LoopBack0]i…...

【开源免费】基于Vue和SpringBoot的美食推荐商城(附论文)

本文项目编号 T 166 &#xff0c;文末自助获取源码 \color{red}{T166&#xff0c;文末自助获取源码} T166&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

Pandas DataFrame 拼接、合并和关联

拼接:使用 pd.concat(),可以沿着行或列方向拼接 DataFrame。 合并:使用 pd.merge(),可以根据一个或多个键进行不同类型的合并(左连接、右连接、全连接、内连接)。 关联:使用 join() 方法,通常在设置了索引的 DataFrame 上进行关联操作。 concat拼接 按列拼接 df1 = …...

【Redis】Redis修改连接数参数

1.重启操作背景 Redis数据库连接数上限&#xff0c;需要修改配置文件里maxclients参数&#xff0c;修改后需重启数据库 1.1、修改操作系统open files参数 1.2、修改redis连接数 2.登录操作系统 登录堡垒机 ssh {ip}3.查看当前状态 3.1、查看操作系统配置 ulimit -a3.2、…...

scratch变魔术 2024年12月scratch三级真题 中国电子学会 图形化编程 scratch三级真题和答案解析

目录 scratch变魔术 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、 推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、py…...

51单片机开发:点阵屏显示数字

实验目标&#xff1a;在8x8的点阵屏上显示数字0。 点阵屏的原理图如下图所示&#xff0c;点阵屏的列接在P0端口&#xff0c;行接在74HC595扩展的DP端口上。 扩展口的使用详见&#xff1a;51单片机开发&#xff1a;IO扩展(串转并)实验-CSDN博客 要让点阵屏显示数字&#xff0…...

mysql DDL可重入讨论

mysql的bug&#xff1a;当执行 MySQL online DDL 时&#xff0c;期间如有其他并发的 DML 对相同的表进行增量修改&#xff0c;比如 update、insert、insert into … on duplicate key、replace into 等&#xff0c;且增量修改的数据违背唯一约束&#xff0c;那么 DDL 最后都会执…...

DAY01 面向对象回顾、继承、抽象类

学习目标 能够写出类的继承格式public class 子类 extends 父类{}public class Cat extends Animal{} 能够说出继承的特点子类继承父类,就会自动拥有父类非私有的成员 能够说出子类调用父类的成员特点1.子类有使用子类自己的2.子类没有使用,继承自父类的3.子类父类都没有编译报…...

127周一复盘 (165)玩法与难度思考

1.上午测试&#xff0c;小改了点东西&#xff0c; 基本等于啥也没干。 匆忙赶往车站。 从此进入春节期间&#xff0c;没有开发&#xff0c;而思考与设计。 2.火车上思考玩法与难度的问题。 目前的主流作法实际上并不完全符合不同玩家的需求&#xff0c; 对这方面还是要有自…...

【C语言常见概念详解】

目录 -----------------------------------------begin------------------------------------- 什么是C语言&#xff1a; 1. 基本数据类型 2. 变量与常量 3. 运算符与表达式 4. 控制结构 5. 函数 6. 指针 7. 数组与字符串 8. 结构体与联合体 9. 文件操作 结语 ----…...

弹性分组环——RPR技术

高频考点&#xff0c;考查20次&#xff1a; RPR与FDDI一样使用双环结构RPR环中的每一个节点都会执行SRP公平算法&#xff08;非DPT、MPLS&#xff09;传统的FDDI环&#xff0c;当源节点成功向目的结点发送一个数据帧后&#xff0c;这个数据帧由源结点从环中回收。但RPR环&#…...

定制Centos镜像

环境准备&#xff1a; 一台最小化安装的干净的系统&#xff0c;这里使用Centos7.9,一个Centos镜像&#xff0c;镜像也使用Centos7.9的。 [rootlocalhost ~]# cat /etc/system-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]# rpm -qa | wc -l 306 [rootloca…...

Java---判断素数的三种方法

我们首先先来了解一下什么是素数 素数:一个整数只能被1和自身整除 , 注意:0与1不是素数 目录 方法一:暴力法 方法二:除二法(优化) 方法三.根号法(最优法) 方法一:暴力法 最简单最暴力的方法就是根据定义&#xff0c;判断n是不是素数,让n除以2到n-1的所有数,只要遇到能除开…...

多级缓存(亿级并发解决方案)

多级缓存&#xff08;亿级流量&#xff08;并发&#xff09;的缓存方案&#xff09; 传统缓存的问题 传统缓存是请求到达tomcat后&#xff0c;先查询redis&#xff0c;如果未命中则查询数据库&#xff0c;问题如下&#xff1a; &#xff08;1&#xff09;请求要经过tomcat处…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...