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
会按照升序排列,即从小到大、从A
到Z
。也可以通过-r
选项进行从大到小的降序排列。 -
sort
的-n
和-g
选项都能用于数值排序,但-n
选项只能识别一些简单数值形式,如整数、浮点数等。而-g
选项则能处理更广泛的数值表示形式,如科学计数法。其在解析复杂数值格式方面更为健壮。但在处理简单的数字时可能没有-n
的效率高。 -
默认情况下
-R
选项会使用系统内部生成的随机种子,而--random-source=FILE
允许用户指定一个文件作为随机数生成的源,即随机种子文件。这个选项与-R
结合使用时可以控制随机排序的结果,如果两次随机排序指定了同一个文件并且文件内容没有变,则随机排序结果也是相同的。需要注意的是如果该文件包含的内容长度不够时会报错。 -
-c
和-C
选项都用于检测输入数据是否经过排序,如果检测到是排序后的数据,则不会输出任何信息并且以0
状态码退出。不同的是,如果遇到未排序的数据,-c
会输出第一个未排序行的信息,并以非零错误码退出,而-C
不会输出任何信息,仅以一个非零错误码退出来指示未排序状态。 -
sort
命令的排序顺序会受到系统区域设置(locale
)的影响。为了确保排序结果的一致性,可以通过设置LC_ALL=C
来强制使用传统的字节值排序。