Linux sort 命令:文本排序

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将探索 Linux 中功能强大的 sort 命令,这是一个用于组织和排列文本数据的多功能工具。作为一名学校管理员,你将使用 sort 命令的各种选项来高效管理和分析学生信息。通过动手实践,你将了解如何在现实场景中使用 Linux 命令行工具来操作数据。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux/TextProcessingGroup -.-> linux/sort("Text Sorting") subgraph Lab Skills linux/sort -.-> lab-219196{{"Linux sort 命令:文本排序"}} end

学生姓名的基础排序

让我们从按字母顺序对学生姓名列表进行排序开始。这是在创建班级花名册或整理学生记录时的常见任务。

首先,查看我们的学生列表内容:

cat ~/project/students.txt

你应该会看到一个未按特定顺序排列的学生姓名列表,类似于以下内容:

David Lee
Alice Johnson
Charlie Brown
Bob Smith
Eve Wilson

现在,使用 sort 命令按字母顺序排列这些姓名:

sort ~/project/students.txt

此命令将在屏幕上显示排序后的学生姓名列表。输出应如下所示:

Alice Johnson
Bob Smith
Charlie Brown
David Lee
Eve Wilson

默认情况下,sort 命令按字母顺序对行进行排序。它会逐字符比较每一行,从每行的开头开始。这就是为什么 "Alice" 排在 "Bob" 之前,依此类推。

如果你没有看到任何输出,请不要担心!命令已经执行,只是结果显示在终端中。如果你希望将排序后的列表保存到新文件中,可以使用输出重定向操作符 >,如下所示:sort ~/project/students.txt > ~/project/sorted_students.txt

按学生年龄排序

接下来,我们将按学生的年龄进行排序。这在将学生组织到适合年龄的组别或活动中时非常有用。

首先查看我们的数据:

cat ~/project/student_ages.txt

你将看到一个包含学生姓名及其年龄的列表,如下所示:

David Lee:21
Alice Johnson:18
Charlie Brown:19
Bob Smith:20
Eve Wilson:18

要按年龄对此列表进行排序,我们将使用 -n 选项,该选项告诉 sort 将数字视为数值而不是字符串:

sort -n -t: -k2 ~/project/student_ages.txt

让我们分解这个命令:

  • -n:此选项告诉 sort 执行数值排序。
  • -t::此选项指定字段以冒号分隔。
  • -k2:此选项告诉 sort 使用第二个字段(年龄)作为排序键。

这将显示按年龄从小到大排序的学生列表:

Alice Johnson:18
Eve Wilson:18
Charlie Brown:19
Bob Smith:20
David Lee:21

如果没有 -n 选项,sort 会将年龄视为字符串,从而导致错误的排序顺序(例如 18, 19, 20, 21, 3)。-n 选项确保正确的数值排序。

学生成绩的逆序排序

现在,我们将按降序对学生成绩进行排序。这通常用于对学生进行排名或识别表现优异的学生。

首先,查看当前列表:

cat ~/project/student_grades.txt

你应该会看到类似以下内容:

David Lee:87
Alice Johnson:92
Charlie Brown:95
Bob Smith:88
Eve Wilson:91

要将成绩从高到低排序,我们将使用 -r 选项进行逆序排序,并结合 -n 选项进行数值排序:

sort -nr -t: -k2 ~/project/student_grades.txt

以下是命令的每个部分的作用:

  • -n:执行数值排序
  • -r:反转排序顺序(降序而非升序)
  • -t::指定字段以冒号分隔
  • -k2:使用第二个字段(成绩)作为排序键

此命令将按从高到低的顺序显示学生成绩:

Charlie Brown:95
Alice Johnson:92
Eve Wilson:91
Bob Smith:88
David Lee:87

-r 选项在你希望首先查看最高值时特别有用,这在许多现实场景中很常见,例如排名、识别表现优异的学生或任务优先级排序。

按多字段排序学生记录

在这一步中,我们将对一个包含姓名、年龄和成绩的更复杂的学生记录进行排序。这是处理综合学生数据库时的常见场景。

首先查看我们的数据:

cat ~/project/student_records.txt

你将看到每一行包含学生的姓名、年龄和成绩,以冒号分隔,如下所示:

David Lee:21:87
Alice Johnson:18:92
Charlie Brown:19:95
Bob Smith:20:88
Eve Wilson:18:91

要按年龄(第二个字段)排序,如果年龄相同则按成绩(第三个字段)排序,我们将使用以下命令:

sort -t: -k2n -k3nr ~/project/student_records.txt

以下是命令的每个部分的含义:

  • -t: 指定字段以冒号分隔
  • -k2n 按第二个字段(年龄)进行数值排序
  • -k3nr 然后按第三个字段(成绩)进行数值逆序排序

这将显示按年龄(升序)主要排序,如果年龄相同则按成绩(降序)次要排序的学生记录:

Alice Johnson:18:92
Eve Wilson:18:91
Charlie Brown:19:95
Bob Smith:20:88
David Lee:21:87

这种多键排序在需要基于多个条件组织数据时非常有用。在本例中,我们按年龄对学生进行分组,并在每个年龄组内按成绩进行排名。

去除重复条目

有时,学生记录中可能包含重复条目,可能是由于数据输入错误或多次提交造成的。让我们学习如何去除这些重复项。

首先,查看一个可能包含重复项的文件:

cat ~/project/student_clubs.txt

你可能会看到类似以下内容:

Alice Johnson:Chess Club
Bob Smith:Debate Team
Charlie Brown:Chess Club
David Lee:Science Club
Eve Wilson:Debate Team
Alice Johnson:Chess Club
Bob Smith:Science Club

要对列表进行排序并去除重复项,我们将使用 -u 选项:

sort -u ~/project/student_clubs.txt

此命令将显示一个已排序且去重后的学生俱乐部成员列表:

Alice Johnson:Chess Club
Bob Smith:Debate Team
Bob Smith:Science Club
Charlie Brown:Chess Club
David Lee:Science Club
Eve Wilson:Debate Team

-u 选项告诉 sort 只输出相等行中的第一行。换句话说,它在排序后去除重复行。这在需要创建唯一条目列表或尝试识别和消除冗余数据时特别有用。

请注意,"Bob Smith" 出现了两次,因为他参加了两个不同的俱乐部——这些不被视为重复项,因为整行内容不同。

总结

在本实验中,你学习了如何使用 sort 命令来组织各种类型的学生数据。你探索了几个有用的选项:

  • 基本的字母排序
  • 使用 -n 进行数值排序
  • 使用 -r 进行逆序排序
  • 使用 -k 按多个字段排序
  • 使用 -t 自定义字段分隔符
  • 使用 -u 去除重复项

其他有用的 sort 选项包括:

  • -f:排序时忽略大小写
  • -b:忽略前导空格
  • -c:检查输入是否已排序
  • -o:将输出写入文件而非标准输出

这些技能在各种专业场景中管理和分析数据时将非常有用,而不仅限于教育环境。