For the complete documentation index, see llms.txt. This page is also available as Markdown.

sort(1)

sort — 对文本和二进制文件的记录(行)进行排序或合并

名称

sort

概要

sort [-bcCdfghiRMmnrsuVz] [-k field1[,field2]] [-S memsize] [-T dir] [-t char] [-o output] [file ...]

sort --help

sort --version

描述

sort 工具按行对文本和二进制文件进行排序。行是以换行符(默认)或 NUL '\0' 字符(-z 选项)与后续记录分隔的记录。记录可包含任何可打印或不可打印字符。比较基于从每行输入中提取的一个或多个排序键,按照当前 locale 的排序规则和可调整实际排序行为的指定命令行选项,按词典序进行。默认情况下,若未给出键,sort 使用整行进行比较。

命令行选项如下:

-c, --check, -C, --check=silent|quiet 检查单个输入文件是否已排序。若文件未排序,sort 产生相应的错误消息并以退出码 1 退出,否则返回 0。若指定了 -C--check=silentsort 不产生输出。这是 -c 的“静默”版本。

-m, --merge 仅合并。假定输入文件已经预排序。若它们未排序,输出顺序未定义。

-o output, --output=output 将输出打印到 output 文件而非标准输出。

-S size, --buffer-size=size 使用 size 作为内存缓冲区的最大大小。可使用大小修饰符 %、b、K、M、G、T、P、E、Z、Y。若未显式指定内存限制,sort 最多占用约 90% 的可用内存。若文件太大无法装入内存缓冲区,则使用临时磁盘文件执行排序。

-T dir, --temporary-directory=dir 将临时文件存储在目录 dir 中。默认路径为环境变量 TMPDIR 的值,若 TMPDIR 未定义,则使用 /var/tmp

-u, --unique 唯一键。抑制所有键与已处理行相等的行。此选项类似于 -s,意味着稳定排序。若与 -c-C 一起使用,sort 还会检查没有重复键的行。

-s 稳定排序。此选项维持具有相等键的记录的原始顺序。这是一个非标准功能,但被广泛接受和使用。

--version 打印版本号并静默退出。

--help 打印帮助文本并静默退出。

以下选项覆盖默认排序规则。当排序选项独立于键字段规范出现时,它们全局应用于所有排序键。当附加到特定键(参见 -k)时,排序选项覆盖其所附加键的所有全局排序选项。

-b, --ignore-leading-blanks 比较行时忽略前导空白字符。

-d, --dictionary-order 比较时仅考虑空格和字母数字字符。

-f, --ignore-case 比较前将所有小写字符转换为大写等效字符,即执行不区分大小写的排序。

-g, --general-numeric-sort, --sort=general-numeric 按一般数值排序。与 -n 不同,此选项处理一般浮点数。它允许的格式比 -n 更宽松,但性能有明显缺点。

-h, --human-numeric-sort, --sort=human-numeric 按数值排序,但会考虑 SI 后缀(如有)。首先按数字符号(负、零或正)排序;然后按 SI 后缀(空、kK,或 MGTPEZY 之一,按此顺序)排序;最后按数值排序。SI 后缀必须紧跟数字。例如,'12345K' 排在 '1M' 之前,因为 M 比 K“更大”。此排序选项适用于对带 -h-H 选项(人类可读)的单次 df 命令输出进行排序。

-i, --ignore-nonprinting 忽略所有不可打印字符。

-M, --month-sort, --sort=month 按月份排序。未知字符串被视为小于月份名称。

-n, --numeric-sort, --sort=numeric 按算术值对字段进行数值排序。字段开头可有可选空格、可选减号、零个或多个数字(包括小数点和可能的千位分隔符)。

-R, --random-sort, --sort=random 按随机顺序排序。这是输入的随机排列,但相等键排在一起。它通过对输入键哈希并对哈希值排序实现。哈希函数随机选择。哈希函数由 /dev/random 内容随机化,或由 --random-source 指定的文件内容随机化。即使指定了多个排序字段,所有字段都使用相同的随机哈希函数。

-r, --reverse 以相反顺序排序。

-V, --version-sort 对版本号排序。输入行被视为形式为 PREFIX VERSION SUFFIX 的文件名,其中 SUFFIX 匹配正则表达式 "(.([A-Za-z~][A-Za-z0-9~])?)"。文件按其前缀和版本进行比较(版本号中的前导零被忽略,参见下例)。若输入字符串不匹配该模式,则使用字节比较函数进行比较。所有字符串比较在 C locale 中执行,忽略 locale 环境设置。

示例:

字段分隔符的处理可通过以下选项改变:

-b, --ignore-leading-blanks 确定受限排序键的起始和结束位置时忽略前导空格(参见 -k)。若 -b 在第一个 -k 选项之前指定,它全局应用于所有键规范。否则,-b 可独立附加到键规范的每个 field 参数。-b

-k field1[,field2], --key=field1[,field2] 定义一个受限排序键,起始位置为 field1,可选结束位置为 field2-k 选项可多次指定,后续键在先前键比较相等时进行比较。-k 选项替代了过时的 +pos1-pos2 选项,但旧记法仍受支持。

-t char, --field-separator=char 使用 char 作为字段分隔符。确定键偏移时,初始 char 不视为字段的一部分。char 的每次出现都是有意义的(例如,“charchar”分隔出一个空字段)。若未指定 -t,默认字段分隔符是空白字符序列,连续空白 分隔空字段,但确定键偏移时初始空白 被视为字段的一部分。要使用 NUL 作为字段分隔符,使用 -t '\0'

-z, --zero-terminated 使用 NUL 作为记录分隔符。默认情况下,文件中的记录以换行符分隔。使用此选项时,NUL('\0')用作记录分隔符。

其他选项:

--batch-size=num 指定 sort 可同时打开的最大文件数。此选项在有许多输入文件或使用临时文件时影响行为。默认值为 16。

--compress-program=PROGRAM 使用 PROGRAM 压缩临时文件。PROGRAM 在无参数调用时必须将标准输入压缩到标准输出。以参数 -d 调用时必须将标准输入解压到标准输出。若 PROGRAM 失败,sort 必须以错误退出。可在此处使用的 PROGRAM 示例为 bzip2。

--random-source=filename 在随机排序中,文件内容用作哈希函数选择的“种子”数据源。两次使用相同种子数据的随机排序将使用相同的哈希函数,若输入也相同则产生相同结果。默认使用文件 /dev/random

--debug 向标准输出打印一些关于排序过程的额外信息。

--parallel 设置最大执行线程数。默认数量等于 CPU 数量。

--files0-from=filename 从文件 filename 中获取输入文件列表。文件名必须以 NUL 分隔(类似于命令“find ... -print0”产生的输出)。

--radixsort 若排序规范允许,尝试使用基数排序。基数排序仅可用于简单 locale(C 和 POSIX),且不能用于数值或月份排序。基数排序非常快速且稳定。

--mergesort 使用归并排序。这是一种通用算法,始终可使用,但并不总是最快的。

--qsort 若排序规范允许,尝试使用快速排序。此排序算法不能与 -u-s 一起使用。

--heapsort 若排序规范允许,尝试使用堆排序。此排序算法不能与 -u-s 一起使用。

--mmap 尝试使用文件内存映射系统调用。在某些情况下可能提高速度。

可用操作数如下:

file 待排序、合并或检查的文件路径名。若未指定 file 操作数,或 file 操作数为 -,则使用标准输入。

字段定义为字段分隔符和记录分隔符(默认为换行符)以外字符的最大序列。除非指定了 -b,否则前导空格包含在字段中;空白字符序列的第一个空格作为字段分隔符并包含在字段中(除非指定了 -t)。例如,行首的所有空格都被视为第一个字段的一部分。

字段通过 -k field1[,field2] 命令行选项指定。若缺少 field2,键的结束默认为行尾。

参数 field1field2 的形式为 m.nm,n > 0),后可跟一个或多个修饰符 bdfingMr,对应上述讨论的选项。指定 b 时仅应用于其所在的 field1field2,而其余修饰符无论仅与 field1field2 一起指定还是与两者一起指定,都应用于整个键字段。以 m.n 指定的 field1 位置解释为第 m 个字段开头起第 n 个字符。field1 中缺少 .n 意味着 .1,表示第 m 个字段的第一个字符;若 -b 选项生效,n 从第 m 个字段的第一个非空格字符起计数;m.1b 指第 m 个字段的第一个非空格字符。1.n 指行首起第 n 个字符;若 n 大于行长度,该字段视为空。

n 个位置始终从字段开头计数,即使字段短于指定位置数。因此,键实际上可从后续字段中的某个位置开始。

m.n 指定的 field2 位置解释为第 m 个字段开头起(含分隔符)第 n 个字符。缺少 .n 表示第 m 个字段的最后一个字符;m = 0 表示行尾。因此选项 -k v.x,w.y 与过时选项 +v-1.x-1 -w-1.y 同义;省略 y 时,-k v.x,w+v-1.x-1 -w.0 同义。过时的 +pos1 -pos2 选项仍受支持,但 -w.0b 除外,它没有 -k 等价项。

环境变量

LC_COLLATE 用于确定记录排序整理规则的 locale 设置。

LC_CTYPE 用于字符大小写转换和分类的 locale 设置,即哪些字符被视为空格等。

LC_MESSAGES 确定 sort 输出消息语言的 locale 设置。

LC_NUMERIC 确定数值排序中使用数字格式的 locale 设置。

LC_TIME 确定月份排序中使用月份格式的 locale 设置。

LC_ALL 覆盖上述所有 locale 设置的 locale 设置。此环境变量可一次性将所有这些设置为相同值。

LANG 若既未设置相应环境变量也未设置 LC_ALL,作为最后手段用于确定各种特定于 locale 的行为。

TMPDIR 存储临时文件的目录路径。注意 TMPDIR 可被 -T 选项覆盖。

GNUSORT_NUMERIC_COMPATIBILITY 若已定义,-t 不会覆盖 locale 数字符号,即千位分隔符和小数分隔符。默认情况下,若指定的 -t 与千位分隔符或小数点相同,该符号将被视为字段分隔符。旧行为不太明确;该符号同时被视为字段分隔符和数字分隔符。此环境变量启用旧行为。

文件

/var/tmp/.bsdsort.PID.* 临时文件。

/dev/random 随机排序的默认种子文件。

退出状态

sort 工具应以以下值之一退出:

0 成功排序输入文件,或与 -c-C 一起使用时,输入文件已满足排序条件。

1 使用 -c-C 选项时发现乱序(或非唯一)。

2 发生错误。

参见

comm(1), join(1), uniq(1)

标准

sort 工具遵循 IEEE Std 1003.1-2008(“POSIX.1”)规范。

标志 [-ghRMSsTVz] 是 POSIX 规范的扩展。

所有长选项都是规范的扩展,其中一些为兼容 GNU 版本而提供,另一些为自有扩展。

旧键记法 +pos1-pos2 来自 sort 的旧版本,仍受支持,但强烈建议不要使用。

历史

sort 命令首次出现在 Version 1 AT&T UNIX 中。

作者

Gabor Kovesdan gabor@FreeBSD.org,

Oleg Moskalenko mom040267@gmail.com

注释

sort 实现对输入行长度(除可用内存限制外)或行内允许的字节没有限制。

性能很大程度上取决于 locale 设置、排序键的高效选择和键复杂性。最快的排序是使用 C locale、整行、带 -s 选项。一般而言,C locale 最快,其次是单字节 locale,多字节 locale 最慢,但始终遵循正确的整理顺序。至于键规范,行处理越简单,搜索越快。

按算术值排序时,使用 -n 比使用 -g 性能好得多,因此建议尽可能使用 -n

最后更新于

这有帮助吗?