Linux sort 命令:文本排序

LinuxBeginner
立即练习

介绍

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

这是一个引导实验,提供了逐步指导来帮助你学习和练习。请仔细遵循说明完成每个步骤并获得实践经验。历史数据表明,这是一个初学者级别的实验,完成率为 98%。它获得了学习者 100% 的好评率。

学生姓名的基础排序

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

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

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:将输出写入文件而不是标准输出

这些技能在各种专业背景下的数据管理和分析中都将非常宝贵,而不仅仅局限于教育领域。