![根据分数对学生进行排序](https://linux22.com/image/165864/%E6%A0%B9%E6%8D%AE%E5%88%86%E6%95%B0%E5%AF%B9%E5%AD%A6%E7%94%9F%E8%BF%9B%E8%A1%8C%E6%8E%92%E5%BA%8F.png)
我是一名 Linux 新用户,使用了大约 2 周。我正在尝试创建一个非常简单的程序,但首先让我解释一下:我是一家教育机构办公室的助理。我必须定期报告那些比下一年级低1分和低于60分的学生。例如,我的报告包括以下类型的内容:
1. Michael 89
2. John 79
3. Oliver 79
.
.
.
20. Sarah 39
21. Twain 47
.
.
到目前为止,我一直通过查看巨大的列表并一一写下所有学生来手动完成此操作。然而,现在我听说我可以在 bash 中创建一个简单的程序来为我完成这项任务。我知道我可以使用一些工具(例如 grep)来过滤测试,例如
[workstation24 ~] cat students_marks |grep 79
[workstation24 ~] cat students_marks |grep 89
[workstation24 ~] cat students_marks |grep 47
[workstation24 ~] cat students_marks |grep 39
.
.
.
我还创建了一个简单的程序,其中包含以下内容:
#!/bin/bash
grep '69\|79\|89'
它工作正常,但是,我不知道如何告诉这个程序也列出所有低于 60 分的学生。请帮助我,我应该在该计划中包含哪些内容才能列出 60(分)以下的学生。问候
答案1
只是 Piotr 的快速编辑,我用 $NF 替换了 $3,这是最后一个字段
awk '{if ($NF + 0 < 60 || $NF == 69 || $NF == 79 || $NF == 89)print $NF,$0}' file.txt | sort -n | cut -f2- -d' '
$NF 是 awk 中的最后一个字段,它在第一个字段处用 print 打印,因此排序实用程序可以对其进行数字排序(请记住,排序是按升序排列,您可以通过添加附加标志将其更改为降序排列排序是-r),整行/记录/行或者任何你所说的东西都会因为$0而被打印。最后一部分是使用 cut 使用空格分隔符来剪切第一个字段/列。如果删除切割正在使用的最后一个管道,那么您可以看到输出。该代码可能不如人们预期的那么强大,但您可以将其用作参考。我并不声称它是完美的。
答案2
标题中提到了排序,所以让我们从这部分开始。在 GNU/Linux 中有大量的核心实用程序,它允许您处理空间分隔数据的文件。所以你可以种类-n
根据第三列 ( ) 以数字 ( -k 3
) 表示:
sort -n -k 3 students_marks
另一个很棒的工具是AWK。它逐行读取文件并执行一些语句。根据您的情况,您可以使用:
awk '{ if ($3 + 0 < 60 || $3 == 69 || $3 == 79 || $3 == 89) print; }' student_marks
在命令行上。它不能(或者更确切地说,它很麻烦)对结果进行排序,但您可以使用管道将命令的输出连接到另一个命令的输入|
:
#!/bin/bash
awk '{ if ($3 + 0 < 60 || $3 == 69 || $3 == 79 || $3 == 89) print; }' $1 |
sort -n -k 3
当您运行脚本时,最后一个$1
将替换为您在命令行上提供的参数。