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

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 来强制使用传统的字节值排序。


http://www.kler.cn/a/522066.html

相关文章:

  • Git进阶之旅:Git 配置信息 Config
  • 【Redis】List 类型的介绍和常用命令
  • Oracle Primavera P6 最新版 v24.12 更新 1/2
  • windows lm studio 0.3.8无法下载模型,更换镜像
  • 周末总结(2024/01/25)
  • 第05章 11 动量剖面可视化代码一则
  • (1)SpringBoot入门+彩蛋
  • JavaSE第十一天——集合框架Collection
  • java —— 面向对象(下)
  • 【数据结构】(2)时间、空间复杂度
  • 学习yosys(一款开源综合器)
  • 一文掌握ADB的安装及使用
  • 【全栈】SprintBoot+vue3迷你商城(9)
  • 线程配置经验
  • 一元函数微积分的几何应用:二维平面光滑曲线的曲率公式
  • 苍穹外卖 项目记录 day09 历史订单
  • arkui-x 前端布局编码模板
  • 详解Redis之事务
  • 深度解析:MyBatis-Plus实现分页查询的封装!
  • Meta 计划 2025 年投资 650 亿美元推动 AI 发展
  • mysql DDL可重入讨论
  • 面试题-Java集合框架
  • 【C++高并发服务器WebServer】-9:多线程开发
  • 图形编辑器基于Paper.js教程22:在图形矢量编辑器中,实现两个元素的差集,交集,并集,切割
  • 若依基本使用及改造记录
  • 【C++】0xc0000005写入位置时发生访问冲突解决方法