sort.1

SORT(1)

SORT(1)

FreeBSD General Commands Manual

SORT(1)

sort

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

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

sort 实用程序按行对文本和二进制文件进行排序。 行是由换行符(默认)或 NUL ´\0´ 字符(-z 选项)与后续记录分隔的记录。 记录可以包含任何可打印或不可打印的字符。 比较基于从每一行输入中提取的一个或多个排序键,并根据当前语言环境的整理规则和可以调整实际排序行为的指定命令行选项按字典顺序执行。 默认情况下,如果没有给出键, sort 使用整行进行比较。

命令行选项如下:

-c, -``-check, -C, -``-check=silent|quiet

检查单个输入文件是否已排序。 如果文件未排序,则 sort 会产生相应的错误消息并以代码 1 退出,否则返回 0。 如果指定了 -C-``-check=silent ,则 sort 不会产生任何输出。 这是 -c 的 "silent" 版本。

-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 后缀(按顺序为空,或“k”或“K”,或“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 语言环境中执行,语言环境设置被忽略。

Example:

$ ls sort* | sort -V

sort-1.022.tgz

sort-1.23.tgz

sort-1.23.1.tgz

sort-1.024.tgz

sort-1.024.003.

sort-1.024.003.tgz

sort-1.024.07.tgz

sort-1.024.009.tgz

可以使用以下选项更改字段分隔符的处理:

-b, -``-ignore-leading-blanks

在确定受限排序键的开始和结束时忽略前导空格(请参阅 -k )。 如果 -b 在第一个 -k 选项之前指定,它将全局应用于所有密钥规范。 否则, -b 可以独立地附加到密钥规范的每个 field 参数。

-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

将有关排序过程的一些额外信息打印到标准输出。

-``-files0-from=filename

从文件 filename 中获取输入文件列表。 文件名必须用 NUL 分隔(如命令 "find ... -print0" 产生的输出)。

-``-radixsort

如果排序规范允许,请尝试使用基数排序。 基数排序只能用于普通语言环境(C 和 POSIX),不能用于数字或月份排序。 基数排序非常快速且稳定。

-``-mergesort

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

-``-qsort

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

-``-heapsort

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

-``-mmap

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

可以使用以下操作数:

file

要排序、合并或检查的文件的路径名。 如果没有指定 file 操作数,或者 file 操作数是 -, 则使用标准输入。

字段定义为除字段分隔符和记录分隔符(默认为换行符)之外的最大字符序列。 除非指定了 -b ,否则该字段中包含初始空格;一系列空格中的第一个空格充当字段分隔符并包含在字段中(除非指定了 -t )。 例如,行首的所有空格都被认为是第一个字段的一部分。

字段由 -k field1[,field2] 命令行选项指定。 如果缺少 field2 ,则键的末尾默认为行尾。

参数 field1 和 field2 的形式为 m.n (m,n > 0) ,并且可以后跟一个或多个修饰符 b, d, f, i, n, g, Mr, 它们对应于上面讨论的选项. 当指定 b 时,它仅适用于指定它的 field1 或 field2 ,而其余修饰符适用于整个关键字段,无论它们是否仅与 field1 或 field2 或两者一起指定。 由 m.n 指定的 field1 位置被解释为从第 m 个字段开始的第 n 个字符。 field1 中缺少的 .n 表示 ‘.1’, 表示第 m 个字段的第一个字符;如果 -b 选项有效, n 从第 m 个字段中的第一个非空白字符开始计数; m.1b 指第 m 个字段中的第一个非空白字符。 1.n 指从行首开始的第 n 个字符;如果 n 大于行的长度,则该字段为空。

n 个位置始终从字段开始计算,即使字段短于指定位置的数量。 因此,密钥可以真正从后续字段中的位置开始。

m.n 指定的 field2 位置被解释为从第 n 个字段开始的第 m 个字符(包括分隔符)。 缺少的 .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

用于确定排序记录的排序规则的区域设置。

LC_CTYPE

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

LC_MESSAGES

确定 sort 打印输出的输出消息的语言的区域设置。

LC_NUMERIC

确定数字排序中使用的数字格式的区域设置。

LC_TIME

确定月份排序中使用的月份格式的区域设置。

LC_ALL

覆盖所有上述区域设置的区域设置。 此环境变量可用于一次将所有这些设置设置为相同的值。

LANG

如果既没有设置相应的环境变量,也没有设置 LC_ALL ,则作为最后的手段来确定不同类型的特定于语言环境的行为。

NLSPATH

NLS 目录的路径。

TMPDIR

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

GNUSORT_NUMERIC_COMPATIBILITY

如果定义 -t 将不会覆盖区域设置数字符号,即千位分隔符和小数分隔符。 默认情况下,如果我们指定 -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 的这种实现对输入行长度没有限制(除了可用内存强加的限制)或对行内允许的字节的任何限制。

性能在很大程度上取决于语言环境设置、排序键的有效选择和键的复杂性。 最快的排序是使用语言环境 C,在整行上,带有选项 -s 。 通常,语言环境 C 是最快的,然后是单字节语言环境,多字节语言环境最慢,但始终遵循正确的排序顺序。 至于关键规范,处理线越简单,搜索就越快。

当按算术值排序时,使用 -n-g 产生更好的性能,因此鼓励尽可能使用它。

September 4, 2019

FreeBSD 13.1-RELEASE

最后更新于

FreeBSD 中文社区