Linux shell编程学习笔记71: sort 命令——构造有序世界

news2025/1/11 20:51:50

0 前言

在大数据时代,我们面对和使用大量数据,如果数据是有序的,无疑是有益的。

在Linux中,我们可以使用 sort 命令来构造一个有序的空间。

1 sort命令 的功能、格式和选项说明

我们可以使用命令sort --help来获取帮助信息。

[purpleendurer @ bash ~] sort --help
Usage: sort [OPTION]... [FILE]...
  or:  sort [OPTION]... --files0-from=F
Write sorted concatenation of all FILE(s) to standard output.

Mandatory arguments to long options are mandatory for short options too.
Ordering options:

  -b, --ignore-leading-blanks  ignore leading blanks
  -d, --dictionary-order      consider only blanks and alphanumeric characters
  -f, --ignore-case           fold lower case to upper case characters
  -g, --general-numeric-sort  compare according to general numerical value
  -i, --ignore-nonprinting    consider only printable characters
  -M, --month-sort            compare (unknown) < 'JAN' < ... < 'DEC'
  -h, --human-numeric-sort    compare human readable numbers (e.g., 2K 1G)
  -n, --numeric-sort          compare according to string numerical value
  -R, --random-sort           sort by random hash of keys
      --random-source=FILE    get random bytes from FILE
  -r, --reverse               reverse the result of comparisons
      --sort=WORD             sort according to WORD:
                                general-numeric -g, human-numeric -h, month -M,
                                numeric -n, random -R, version -V
  -V, --version-sort          natural sort of (version) numbers within text

Other options:

      --batch-size=NMERGE   merge at most NMERGE inputs at once;
                            for more use temp files
  -c, --check, --check=diagnose-first  check for sorted input; do not sort
  -C, --check=quiet, --check=silent  like -c, but do not report first bad line
      --compress-program=PROG  compress temporaries with PROG;
                              decompress them with PROG -d
      --debug               annotate the part of the line used to sort,
                              and warn about questionable usage to stderr
      --files0-from=F       read input from the files specified by
                            NUL-terminated names in file F;
                            If F is - then read names from standard input
  -k, --key=KEYDEF          sort via a key; KEYDEF gives location and type
  -m, --merge               merge already sorted files; do not sort
  -o, --output=FILE         write result to FILE instead of standard output
  -s, --stable              stabilize sort by disabling last-resort comparison
  -S, --buffer-size=SIZE    use SIZE for main memory buffer
  -t, --field-separator=SEP  use SEP instead of non-blank to blank transition
  -T, --temporary-directory=DIR  use DIR for temporaries, not $TMPDIR or /tmp;
                              multiple options specify multiple directories
      --parallel=N          change the number of sorts run concurrently to N
  -u, --unique              with -c, check for strict ordering;
                              without -c, output only the first of an equal run
  -z, --zero-terminated     end lines with 0 byte, not newline
      --help     display this help and exit
      --version  output version information and exit

KEYDEF is F[.C][OPTS][,F[.C][OPTS]] for start and stop position, where F is a
field number and C a character position in the field; both are origin 1, and
the stop position defaults to the line's end.  If neither -t nor -b is in
effect, characters in a field are counted from the beginning of the preceding
whitespace.  OPTS is one or more single-letter ordering options [bdfgiMhnRrV],
which override global ordering options for that key.  If no key is given, use
the entire line as the key.

SIZE may be followed by the following multiplicative suffixes:
% 1% of memory, b 1, K 1024 (default), and so on for M, G, T, P, E, Z, Y.

With no FILE, or when FILE is -, read standard input.

*** WARNING ***
The locale specified by the environment affects sort order.
Set LC_ALL=C to get the traditional sort order that uses
native byte values.

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
Report sort translation bugs to <http://translationproject.org/team/>
For complete documentation, run: info coreutils 'sort invocation'
[purpleendurer @ bash ~] 

 

1.1 sort命令的功能

sort命令的功能如其名,就是排序。

sort命令不仅可以用来对文件内容按行进行排序处理,而且可以配合其他命令一起使用,对命令的输出结果进行排序处理。

特别是uniq命令,uniq命令要求输入的数据必须经过排序。

1.2 sort命令的格式

有两种格式。

1.2.1 sort命令的格式1

sort [选项]... [文件]...

1.2.2 sort命令的格式2

 sort [选项]... --files0-from=F

1.3 sort命令的选项说明

 sort命令的选项分为排序选项和其他选项两类。

1.3.1 sort命令的排序选项

选项说明
-b, --ignore-leading-blanks忽略每行前面开始出的空格字符
-d, --dictionary-order排序时只考虑空格和字母数字字符
-f, --ignore-case排序时忽略字母大小写
-g, --general-numeric-sort按一般数值比较
-i, --ignore-nonprinting排序时只考虑可打印字符
-M, --month-sort将前面3个字母依照月份的缩写来进行排序。
-h, --human-numeric-sort比较人类可读的数字(例如,2K 1G)
-n, --numeric-sort根据字符串数值进行比较
-R, --random-sort按键的随机哈希排序
--random-source=文件名从指定文件中获取随机字节
-r, --reverse以相反的顺序来排序
--sort=字

按指定字代表的类型来进行排序:

指定字:通用数字 -g,人文数字 -h,月份 -M,数字 -n,随机 -R,版本 -V

-V, --version-sort文本中(版本)数字的自然排序

1.3.2 sort命令的其他选项

选项说明
--batch-size=NMERGE一次合并最多 NMERGE 输入;如需更多,请使用临时文件
-c, --check, --check=diagnose-first检查输入是否已排序;不排序
-C, --check=quiet, --check=silent类似-c,但不报告第一个无序行
--compress-program=程序名称使用指定程序压缩临时文件;使用该程序的-d 参数解压缩文件
--debug为用于排序的行添加注释,并将有可能有问题的用法输出到标准错误输出
--files0-from=文件名从指定文件读取以NUL 终止的名称,如果该文件被指定为"-"则从标准输入读文件名
-k, --key=KEYDEF通过键进行排序;KEYDEF 要给出位置和类型
-m, --merge合并已排序的文件;不排序
-o, --output=FILE将结果写入到文件而非标准输出
-s, --stable禁用last-resort 比较以稳定比较算法
-S, --buffer-size=SIZE指定主内存缓存大小
-t, --field-separator=分隔符使用指定的分隔符代替非空格到空格的转换
-T, --temporary-directory=目录使用指定目录而非$TMPDIR 或/tmp 作为临时目录,可用多个选项指定多个目录
--parallel=N将同时运行的排序数改变为N
-u, --unique与-c配合时,严格校验排序;不与-c配合时,则只输出一次排序结果
-z, --zero-terminated行结束符为 NUL,而不是换行符
--help显示此帮助信息并退出
--version显示版本信息并退出

2 sort命令的使用实例

2.1 创建演示文件

我们先创建两个演示用的文件。

2.1.1 创建演示文件ta.txt

[purpleendurer @ bash ~] echo -e "Windows95 1995 June\nWindows98 1998 August\nDOS 1981 May" > ta.txt
[purpleendurer @ bash ~] cat ta.txt
Windows95 1995 June
Windows98 1998 August
DOS 1981 May
[purpleendurer @ bash ~] 

 

2.1.2 创建演示文件tb.txt

[purpleendurer @ bash ~] echo -e "Debian 1998 November\nUbuntu 1999 December\nGentoo 2002 February" > tb.txt
[purpleendurer @ bash ~] cat tb.txt
Debian 1998 November
Ubuntu 1999 December
Gentoo 2002 February
[purpleendurer @ bash ~] 

2.2 以默认方式对文件内容进行排序并输出排序结果: sort 文件

2.2.1 sort ta.txt

[purpleendurer @ bash ~] cat ta.txt
Windows95 1995 June
Windows98 1998 August
DOS 1981 May
[purpleendurer @ bash ~] sort ta.txt
DOS 1981 May
Windows95 1995 June
Windows98 1998 August
[purpleendurer @ bash ~] 

 

通过对比文件的原始内容以及sort命令排序后的内容,我们可以发现,排序之后, 原来位于第3行的DOS 1981 May排到了第1行。这是因为 D < W,而且Windows95 < Windows 98。

2.2.2 sort tb.txt

[purpleendurer @ bash ~] cat tb.txt
Debian 1998 November
Ubuntu 1999 December
Gentoo 2002 February
[purpleendurer @ bash ~] sort tb.txt
Debian 1998 November
Gentoo 2002 February
Ubuntu 1999 December
[purpleendurer @ bash ~] 

 

通过对比文件的原始内容以及sort命令排序后的内容,我们可以发现,排序之后, 原来的第2行Ubuntu 1999 December和 第3行Gentoo 2002 February对掉了位置。这是因为 D < G < U。

总结一下:

sort 命令默认方式是将文本文件的第一列以 ASCII 码的次序排列,并将结果输出到标准输出。

2.3 以相反的顺序来排序:sort /r 文件

2.3.1 sort /r ta.txt

[purpleendurer @ bash ~] cat ta.txt
Windows95 1995 June
Windows98 1998 August
DOS 1981 May
[purpleendurer @ bash ~] sort -r ta.txt
Windows98 1998 August
Windows95 1995 June
DOS 1981 May
[purpleendurer @ bash ~]

 

 通过对比文件的原始内容以及sort /r 命令排序后的内容,我们可以发现,排序之后, 原来位于第2行的Windows98 1998 August和位于第1行的Windows95 1995 June对换了位置。

2.3.2 sort /r tb.txt

[purpleendurer @ bash ~] cat tb.txt
Debian 1998 November
Ubuntu 1999 December
Gentoo 2002 February
[purpleendurer @ bash ~] sort -r tb.txt
Ubuntu 1999 December
Gentoo 2002 February
Debian 1998 November
[purpleendurer @ bash ~] 

 通过对比文件的原始内容以及sort /r 命令排序后的内容,我们可以发现,排序之后, 3行内容的位置都有变动,按照首列字母由大到小排列:U > G > D。

2.4 随机排序 :sort -R 文件

以tb.txt文件为例。

在默认情况下,以第1列为进行随机排序。

[purpleendurer @ bash ~] cat tb.txt
Debian 1998 November
Ubuntu 1999 December
Gentoo 2002 February
[purpleendurer @ bash ~] sort -R tb.txt
Debian 1998 November
Gentoo 2002 February
Ubuntu 1999 December
[purpleendurer @ bash ~] 

 

 通过对比可以发现,第2行和第3行对换了位置。

如果我们指定以第2列来进行随机排序,结果又会是怎样的呢?

[purpleendurer @ bash ~] cat tb.txt
Debian 1998 November
Ubuntu 1999 December
Gentoo 2002 February
[purpleendurer @ bash ~] sort -R -k 2 tb.txt
Debian 1998 November
Ubuntu 1999 December
Gentoo 2002 February
[purpleendurer @ bash ~] sort -R -k 2 tb.txt
Gentoo 2002 February
Ubuntu 1999 December
Debian 1998 November
[purpleendurer @ bash ~] 

可以看到,两次随机排序的结果并不相同。

2.5 将前面3个字母依照月份的缩写来进行排序:sort -M 文件

我们先看看ta.txt的排序结果。

[purpleendurer @ bash ~] cat ta.txt
Windows95 1995 June
Windows98 1998 August
DOS 1981 May
[purpleendurer @ bash ~] sort -k 3 ta.txt
Windows98 1998 August
Windows95 1995 June
DOS 1981 May
[purpleendurer @ bash ~] sort -k 3 -M ta.txt
DOS 1981 May
Windows95 1995 June
Windows98 1998 August
[purpleendurer @ bash ~] 

 

当我们使用命令sort -k 3 ta.txt 来指定按第3 列排序时,第1行和第2行做了对换,这是因为按照第3列的首字母:A < J < M。

当我们使用命令sort -k 3 -M ta.txt 来指定按第3 列排序时,第1行和第3行做了对换,这是因为按照第3列前3个字母依照月份的缩写:May(5月)< June(6月) < August(8月)。

对于tb.txt,排序结果如下:

[purpleendurer @ bash ~] cat tb.txt
Debian 1998 November
Ubuntu 1999 December
Gentoo 2002 February
[purpleendurer @ bash ~] sort -k 3 tb.txt
Ubuntu 1999 December
Gentoo 2002 February
Debian 1998 November
[purpleendurer @ bash ~] sort -k 3 -M tb.txt
Debian 1998 November
Gentoo 2002 February
Ubuntu 1999 December
[purpleendurer @ bash ~] 

 

 

2.5 多个文件内容排序输出: sort [选项] 文件1 文件2……

我们以ta.txt 和tb.txt来例。

[purpleendurer @ bash ~] sort ta.txt tb.txt
Debian 1998 November
DOS 1981 May
Gentoo 2002 February
Ubuntu 1999 December
Windows95 1995 June
Windows98 1998 August
[purpleendurer @ bash ~] sort -k 3 ta.txt tb.txt
Windows98 1998 August
Ubuntu 1999 December
Gentoo 2002 February
Windows95 1995 June
DOS 1981 May
Debian 1998 November
[purpleendurer @ bash ~] sort -k 3 -M ta.txt tb.txt
Debian 1998 November
DOS 1981 May
Gentoo 2002 February
Ubuntu 1999 December
Windows95 1995 June
Windows98 1998 August
[purpleendurer @ bash ~] 

可以看到,我们给sort命令使用的选项不同,排序的结果也不同。

2.6 利用输出重定向将排序结果保存到文件: sort [选项] 文件1 文件2…… > 文件3

我们还可以使用命令sort -k 2 ta.txt tb.txt > tab.txt 将文件 ta和txt tb按照第2列的排序结果保存到文件tab.txt。

[purpleendurer @ bash ~] sort -k 2 ta.txt tb.txt > tab.txt
[purpleendurer @ bash ~] cat tab.txt
DOS 1981 May
Windows95 1995 June
Windows98 1998 August
Debian 1998 November
Ubuntu 1999 December
Gentoo 2002 February
[purpleendurer @ bash ~] 

2.7 对其他命令的输出结果进行排序:其他命令 |  sort [选项]

我们可以利用管道操作来对其他命令的输出结果进行排序输出。

我们以对ls命令的输出结果进行排序输出为例。

[purpleendurer @ bash ~] ls
Code  tab.txt  ta.txt  tb.txt
[purpleendurer @ bash ~] ls | sort
Code
tab.txt
ta.txt
tb.txt
[purpleendurer @ bash ~] ls | sort -V
Code
ta.txt
tab.txt
tb.txt
[purpleendurer @ bash ~] 

 可以看到,我们给sort命令指定的选项不同,排序的结果也不同。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spark MLlib 特征工程(下)

Spark MLlib 特征工程(下) 前面我们提到&#xff0c;典型的特征工程包含如下几个环节&#xff0c;即预处理、特征选择、归一化、离散化、Embedding 和向量计算&#xff0c;如下图所示。 在上一讲&#xff0c;我们着重讲解了其中的前 3 个环节&#xff0c;也就是预处理、特征选…

Memecoin的火爆与AMM在Solana上的主导地位

随着Solana区块链的高速发展&#xff0c;尤其是近年来Memecoin市场的崛起&#xff0c;AMM&#xff08;自动做市商&#xff09;逐渐成为Solana去中心化交易所&#xff08;DEX&#xff09;的主导交易模式。尽管Solana以其高效性能能够支持每秒数千笔交易&#xff0c;足以让中心化…

【C语言篇】深入理解指针3(附转移表源码)

文章目录 数组指针什么是数组指针数组指针变量的初始化 二维数组传参的本质函数指针函数指针变量的创建函数指针变量的使用 两端有趣的代码typedef 关键字 函数指针数组转移表写在最后 数组指针 什么是数组指针 在【C语言篇】深入理解指针2我们学习了指针数组&#xff0c;指针…

Qt项目【上位机十字屏开发】

效果图 说明 重写 QWidget 中的 paintEvent() 处理绘图事件&#xff0c;废话不多说&#xff0c;上代码 源码 #ifndef MYWIDGETFORM_H #define MYWIDGETFORM_H#include <QWidget>namespace Ui { class myWidgetForm; }enum MYTYPE{SIZEWIDTH,SIZEHEIGHT,TOPWIDTH,TOPHE…

XMind在软件需求分析中编写测试用例的应用技巧

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言 在软件需求分析中&#xff0c;编写测试用例是确保软件质量的重要环节。之前很多同学都是用Excel&#xff0c;但是XMind作为一款功能强大的思维导图工具&#xff0c;可以在需求分析阶段帮助测试人员系统地设计和组织测试用…

报错解决——苹果电脑mac装windows10,总是提示“启动转换”安装失败:拷贝Windows安装文件时出错

报错原因&#xff1a; 所安装的镜像文件大于4GB。 解决办法一&#xff1a; 使用小于4GB的镜像文件。 参考文章&#xff1a; 安装小于4GB的windows系统镜像 小于4GB的windows10镜像下载&#xff1a; 系统库官网 解决办法二&#xff1a; 参考文章&#xff1a; Mac air装…

如何利用Maven命令使得本地 .jar 文件安装到本地仓库中,以供其他项目通过 Maven 依赖引用

文件夹打包 例如此时我的文件夹example当中有两个class文件 复制文件夹路径 cmd运行命令&#xff1a;jar cvf nation.jar -C 你的文件夹路径 . 以我的举例&#xff1a; 这样就完成了打包 导入仓库 先找到jar文件的位置&#xff0c;复制路径 并且确定自己有安装好maven命…

【概率统计】三扇门游戏(蒙提霍尔问题)

三扇门游戏 两种答案2/3的重选正确率1/2的重选正确率 正确答案 也称为蒙提霍尔问题&#xff08;Monty Hall problem&#xff09;&#xff1a; 有三扇门&#xff0c;其中只有一扇是正确的门&#xff0c;打开后将能获得一辆豪车。另外两扇门是错误选项&#xff0c;门内只有山羊。…

模板——从初级到进阶

目录 前言&#xff1a; 一、非类型模板参数 二、模板的特化 2.1 函数模板特化 2.2 类模板特化 2.2.1 全特化 2.2.2 偏特化 三、模板分离编译 3.1 什么是分离编译 3.2 模板的分离编译 四、模板总结 前言&#xff1a; 我们前面已经对初阶模板有了比较深刻的了解&#xff…

鸿蒙前端开发——工具安装与项目创建

工具安装 DevEco Studio https://developer.huawei.com/consumer/cn/ 直接下一步。 创建空项目 双击进入 空项目如下&#xff1a; 点击previewer进行预览 备用地址下载

十、OpenCVSharp 中的图像的几何变换

文章目录 简介一、平移1. 平移向量的定义和计算2. 平移操作的矩阵表示二、旋转1. 旋转角度的表示和计算2. 旋转中心的选择3. 旋转矩阵的推导和应用三、缩放1. 缩放因子的确定2. 缩放操作的数学模型3. 缩放过程中的图像插值方法(如最近邻插值、双线性插值、双三次插值)四、仿射…

Qt连接Postgres数据库

数据库相关代码可以看我这篇文章&#xff0c;今天要说的是驱动问题&#xff0c;网上很多说将Postgres/bin目录下的某些.dll文件拷贝到运行目录&#xff0c;实际测试的时候发现&#xff0c;还是加载不了驱动。 后来发现postgres可以直接下载相关的驱动依赖&#xff0c;将流程分…

计算机三级嵌入式笔记(五)——嵌入式系统的开发

目录 考点1 嵌入式系统的开发过程 考点2 嵌入式系统的开发平台与工具 考点3 嵌入式系统的调试 考点4 ADS1.2 工具软件 考点5 RVDS 考点6 GNU 考点7 基于嵌入式 Web 服务器的应用设计 23考纲 考点1 嵌入式系统的开发过程 (1)嵌入式系统的开发过程可以划分为系统需求分析与…

Golang | Leetcode Golang题解之第334题递增的三元子序列

题目&#xff1a; 题解&#xff1a; func increasingTriplet(nums []int) bool {n : len(nums)if n < 3 {return false}first, second : nums[0], math.MaxInt32for i : 1; i < n; i {num : nums[i]if num > second {return true} else if num > first {second n…

Ajax-01.原生方式

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Ajax-原生方式</title> </head> <!-…

Apache Tomcat 信息泄露漏洞排查处理CVE-2024-21733)

一、漏洞描述 Apache Tomcat作为一个流行的开源Web服务器和Java Servlet容器并用于很多中小型项目的开发中。其中,Coyote作为Tomcat的连接器组件,是Tomcat服务器提供的供客户端访问的外部接口,客户端通过Coyote与服务器建立链接、发送请求并且接收响应。 近日发现Apache To…

K8S系列——一、Ubuntu上安装Helm

在使用K8S搭建集群服务时&#xff0c;有时候需要用到Helm&#xff08;一个用于Kubernetes应用管理的工具&#xff09;&#xff0c;下面是在Ubuntu上安装Helm的过程。 1.更新系统软件包列表 sudo apt-get update2.安装必要的依赖项 sudo apt-get install apt-transport-https…

Java | Leetcode Java题解之第337题打家劫舍III

题目&#xff1a; 题解&#xff1a; class Solution {public int rob(TreeNode root) {int[] rootStatus dfs(root);return Math.max(rootStatus[0], rootStatus[1]);}public int[] dfs(TreeNode node) {if (node null) {return new int[]{0, 0};}int[] l dfs(node.left);i…

【es学习】

es学习 1. 倒排索引2. stored fields 用于存储文档信息3. doc values 用于排序和聚合4. segment 具备完整搜索功能的最小单元5. lucene单机文本搜索库6. 从lucene到es&#xff1a;高性能 高扩展性 高可用7. node角色分化8. es写入流程9. es搜索流程10. 倒排索引涉及的数据结构1…

【海奇HC-RTOS平台E100-问题点】

海奇HC-RTOS平台E100-问题点 ■ 屏幕是1280*720, UI是1024*600,是否修改UI■ hc15xx-db-e100-v10-hcdemo.dtb 找不到■ 触摸屏驱动 能否给个实例■ 按键驱动■ __initcall(projector_auto_start)■ source insigt4.0 #ifdef 代码怎么自动灰显示问题■ 补丁是打在运行程序&#…