【问题标题】:A UNIX Command to Find the Name of the Student who has the Second Highest Score用于查找得分第二高的学生姓名的 UNIX 命令
【发布时间】:2020-08-19 18:05:53
【问题描述】:

我是 Unix 编程新手。你能帮我解决这个问题吗? 例如,如果输入文件有以下内容

RollNo Name Score
234 ABC 70
567 QWE 12
457 RTE 56
234 XYZ 80
456 ERT 45

输出将是

ABC

我试过这样的

sort -k3,3 -rn -t" " | head -n2 | awk '{print $2}'

【问题讨论】:

  • 允许使用哪些命令? tail 命令对于在对数据进行排序之前去掉标题行很有用,head 和 tail 可以用来挑选排序数据的第 n 行。
  • @MarkPlotnick tail 命令也允许使用。我尝试了上述方式(据我所知)。请你帮忙告诉那个命令。
  • Tail 输出其输入的最后一部分。您可以指定要输出的行数,从输入的末尾或从开头开始计数。以下是一些可能有所帮助的示例。 tail -n +2 将输入的第二行到最后一行复制到输出。 head -n 4 将输出输入的前 4 行 - 您已经知道这一点 - 但 head -n 4 | tail -n 1 将只输出输入的第 4 行。你已经走了大部分路了;只需要稍微修改一下你的管道。尝试不同的东西,看看它们是什么样子的。

标签: sorting unix awk


【解决方案1】:

使用awk

awk 'NR>1{arr[$3]=$2} END {n=asorti(arr,arr_sorted);  print  arr[arr_sorted[n-1]]}'

演示:

$cat file.txt 
RollNo Name Score
234 ABC 70
567 QWE 12
457 RTE 56
234 XYZ 80
456 ERT 45
$awk 'NR>1{arr[$3]=$2} END {n=asorti(arr,arr_sorted);  print  arr[arr_sorted[n-1]]}'  file.txt 
ABC
$

解释:

NR>1 --> 跳过第一条记录

{arr[$3]=$2} --> 创建以标记为索引、名称为值的关联数组

END

n=asorti(arr,arr_sorted) arr 排序并保存在arr_sorted 中。 n= 数组元素个数

print arr[arr_sorted[n-1]]} n-1 将指向 arr_sorted 中的倒数第二个值(即标记)并打印来自arr 的相应值

【讨论】:

  • 亲爱的@Digvijay,当我执行上面的命令时,它会显示错误为“function asorti never defined”。我该如何解决这个错误。
  • 尝试使用gawk 而不是awk
【解决方案2】:

您的尝试是 90% 正确的,只需进行一次更改 试试这个……它会起作用的。

排序 -k3,3 -rn -t" " |头-n1 | awk '{print $2}'

不要使用 head -n2,而是使用 head -n1

【讨论】:

  • 这是不正确的,因为它会打印得分最高的学生,但我需要得分第二的学生。
猜你喜欢
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
  • 2011-05-21
  • 1970-01-01
相关资源
最近更新 更多