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:按照便于阅读的数值排序,例如2K1G。 -
-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会按照升序排列,即从小到大、从A到Z。也可以通过-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”,表示排序。其主要功能是对文本文件中的行进行排序。它可以根据字母、数字、特定字段等不同的标准进行排序。sort 通过逐行读取文件(没有指定文件或指定文件为 - 时读取标准输入)内容,并按照…...
MyBatis最佳实践:提升数据库交互效率的秘密武器
第一章:框架的概述: MyBatis 框架的概述: MyBatis 是一个优秀的基于 Java 的持久框架,内部对 JDBC 做了封装,使开发者只需要关注 SQL 语句,而不关注 JDBC 的代码,使开发变得更加的简单MyBatis 通…...
选择困难?直接生成pynput快捷键字符串
from pynput import keyboard# 文档:https://pynput.readthedocs.io/en/latest/keyboard.html#monitoring-the-keyboard # 博客(pynput相关源码):https://blog.csdn.net/qq_39124701/article/details/145230331 # 虚拟键码(十六进制):https:/…...
DeepSeek-R1:强化学习驱动的推理模型
1月20日晚,DeepSeek正式发布了全新的推理模型DeepSeek-R1,引起了人工智能领域的广泛关注。该模型在数学、代码生成等高复杂度任务上表现出色,性能对标OpenAI的o1正式版。同时,DeepSeek宣布将DeepSeek-R1以及相关技术报告全面开源。…...
国内优秀的FPGA设计公司主要分布在哪些城市?
近年来,国内FPGA行业发展迅速,随着5G通信、人工智能、大数据等新兴技术的崛起,FPGA设计企业的需求也迎来了爆发式增长。很多技术人才在求职时都会考虑城市的行业分布和发展潜力。因此,国内优秀的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 拉,拽,拖 He tugged the door open with all his might…...
基于RIP的MGRE实验
实验拓扑 实验要求 按照图示配置IP地址配置静态路由协议,搞通公网配置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 ,文末自助获取源码 \color{red}{T166,文末自助获取源码} T166,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程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数据库连接数上限,需要修改配置文件里maxclients参数,修改后需重启数据库 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单片机开发:点阵屏显示数字
实验目标:在8x8的点阵屏上显示数字0。 点阵屏的原理图如下图所示,点阵屏的列接在P0端口,行接在74HC595扩展的DP端口上。 扩展口的使用详见:51单片机开发:IO扩展(串转并)实验-CSDN博客 要让点阵屏显示数字࿰…...
mysql DDL可重入讨论
mysql的bug:当执行 MySQL online DDL 时,期间如有其他并发的 DML 对相同的表进行增量修改,比如 update、insert、insert into … on duplicate key、replace into 等,且增量修改的数据违背唯一约束,那么 DDL 最后都会执…...
DAY01 面向对象回顾、继承、抽象类
学习目标 能够写出类的继承格式public class 子类 extends 父类{}public class Cat extends Animal{} 能够说出继承的特点子类继承父类,就会自动拥有父类非私有的成员 能够说出子类调用父类的成员特点1.子类有使用子类自己的2.子类没有使用,继承自父类的3.子类父类都没有编译报…...
127周一复盘 (165)玩法与难度思考
1.上午测试,小改了点东西, 基本等于啥也没干。 匆忙赶往车站。 从此进入春节期间,没有开发,而思考与设计。 2.火车上思考玩法与难度的问题。 目前的主流作法实际上并不完全符合不同玩家的需求, 对这方面还是要有自…...
【C语言常见概念详解】
目录 -----------------------------------------begin------------------------------------- 什么是C语言: 1. 基本数据类型 2. 变量与常量 3. 运算符与表达式 4. 控制结构 5. 函数 6. 指针 7. 数组与字符串 8. 结构体与联合体 9. 文件操作 结语 ----…...
弹性分组环——RPR技术
高频考点,考查20次: RPR与FDDI一样使用双环结构RPR环中的每一个节点都会执行SRP公平算法(非DPT、MPLS)传统的FDDI环,当源节点成功向目的结点发送一个数据帧后,这个数据帧由源结点从环中回收。但RPR环&#…...
定制Centos镜像
环境准备: 一台最小化安装的干净的系统,这里使用Centos7.9,一个Centos镜像,镜像也使用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不是素数 目录 方法一:暴力法 方法二:除二法(优化) 方法三.根号法(最优法) 方法一:暴力法 最简单最暴力的方法就是根据定义,判断n是不是素数,让n除以2到n-1的所有数,只要遇到能除开…...
多级缓存(亿级并发解决方案)
多级缓存(亿级流量(并发)的缓存方案) 传统缓存的问题 传统缓存是请求到达tomcat后,先查询redis,如果未命中则查询数据库,问题如下: (1)请求要经过tomcat处…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...
