sort 命令读取完整的行,根据所选比较规则排列它们,并将结果写入 stdout。除非明确选择输出操作,否则它不会更改输入文件。
文本操作 · 第 12 课
sort
学习如何使用 sort 按词法、数值或所选字段值排列文本行。
对完整行排序
假设 animals.txt 包含:
dog
cow
cat
elephant
bird
按升序排列这些行:
$ sort animals.txt
bird
cat
cow
dog
elephant
文本顺序遵循当前 locale,这会影响大小写、重音字符和标点符号。如果脚本需要可复现的按字节排序,请使用 LC_ALL=C 等一致的 locale:
$ LC_ALL=C sort animals.txt
不使用键或数值选项时,sort animals.txt 会做什么?
反转结果
添加 -r 可反转比较结果:
$ sort -r animals.txt
elephant
dog
cow
cat
bird
哪个命令会按反向顺序排列 animals.txt?
比较数字
词法顺序比较字符,所以 10 通常会排在 2 前面。普通数值比较应使用 -n:
$ printf '10\n2\n30\n' | sort -n
2
10
30
需要时可以组合选项。sort -nr scores.txt 会按数值比较,并把较大的值放在前面。
哪个命令会把 scores.txt 中的数值行按从大到小排列?
按字段排序
使用 -k START[,END] 选择键。默认情况下,字段由连续的空白分隔。对于以冒号分隔的记录,请使用 -t ':':
$ printf 'alice:30\nbob:8\ncarol:20\n' | sort -t ':' -k 2,2n
bob:8
carol:20
alice:30
这里,-t ':' 选择分隔符,-k 2,2 把键限制在字段 2,附加的 n 则对该键进行数值比较。如果没有末尾的 ,2,从字段 2 开始的键通常会一直延续到行尾。
哪个命令会只按 users.txt 中以冒号分隔的第二个字段进行数值排序?
删除重复项并保存输出
使用 -u 可为每个相等的比较键输出一行:
$ sort -u names.txt
它会根据所选比较规则同时排序和删除重复项。如果只想从已经排序的数据中删除相邻重复行,可以使用后续课程介绍的 uniq 命令。
如果目标路径与输入不同,可以使用普通重定向把结果写入文件:
$ sort names.txt > names-sorted.txt
不要运行 sort names.txt > names.txt;shell 会在 sort 读取输入前将其截断。在有意使用同一路径时,GNU sort -o names.txt names.txt 可以安全安排自己的输出:
$ sort -o names.txt names.txt
如果原始数据很重要,请保留备份,或先写入另一个文件并验证结果。
在 GNU/Linux 上,哪个命令会让 sort 把排序结果安全地写回 names.txt,而不会先被 shell 重定向截断?
要练习排列和分析面向行的数据,可以尝试以下动手实验:
- Linux sort 命令:文本排序 - 这个实验直接介绍
sort命令,让你练习以包括升序和降序在内的多种方式排列文本文件中的行。 - 单词计数和排序 - 在这个挑战中,你会把排序知识与单词计数结合起来分析文本数据,找出常见模式并高效排列数据。
课程已完成
你已完成 sort
现在,你可以为排序后的文本选择比较规则和输出目标。
需要可复现结果时,在明确的 locale 下对完整行排序。
使用
-r反转结果。使用
-n比较数值。使用
-t和-k选择有边界的字段键。删除重复项或保存输出,同时避免截断输入。