我有一个学生记录列表,grades
,我想按 GPA 排序,返回前 5 个结果。由于某种原因count<=7
下面切断了最高的结果。我不明白这是为什么。
另外,有没有比将结果通过管道返回到 awk
更优雅的方法来删除排序后的第一列?来自 sort
?
user@machine:~> awk '{ if (count<=7) print $3, $0; count++; }' grades | sort -nr | awk '{ print $2 " " $3 " " $4 " " $5 }'
Ahmad Rashid 3.74 MBA
James Davis 3.71 ECE
Sam Chu 3.68 ECE
John Doe 3.54 ECE
Arun Roy 3.06 SS
James Adam 2.77 CS
Al Davis 2.63 CS
Rick Marsh 2.34 CS
user@machine:~> awk '{ if (count<=8) print $3, $0; count++; }' grades | sort -nr | awk '{ print $2 " " $3 " " $4 " " $5 }'
Art Pohm 4.00 ECE
Ahmad Rashid 3.74 MBA
James Davis 3.71 ECE
Sam Chu 3.68 ECE
John Doe 3.54 ECE
Arun Roy 3.06 SS
James Adam 2.77 CS
Al Davis 2.63 CS
Rick Marsh 2.34 CS
grades
:
John Doe 3.54 ECE
James Davis 3.71 ECE
Al Davis 2.63 CS
Ahmad Rashid 3.74 MBA
Sam Chu 3.68 ECE
Arun Roy 3.06 SS
Rick Marsh 2.34 CS
James Adam 2.77 CS
Art Pohm 4.00 ECE
John Clark 2.68 ECE
Nabeel Ali 3.56 EE
Tom Nelson 3.81 ECE
Pat King 2.77 SS
Jake Zulu 3.00 CS
John Lee 2.64 EE
Sunil Raj 3.36 ECE
Charles Right 3.31 EECS
Diane Rover 3.87 ECE
Aziz Inan 3.75 EECS
Lu John 3.06 CS
Lee Chow 3.74 EE
Adam Giles 2.54 SS
Andy John 3.98 EECS
最佳答案
在这种情况下你实际上不需要awk
。 Unix sort
将按列进行数字排序。
给定你的输入:
$ sort -k 3 -nr grades
Art Pohm 4.00 ECE
Andy John 3.98 EECS
Diane Rover 3.87 ECE
Tom Nelson 3.81 ECE
Aziz Inan 3.75 EECS
Lee Chow 3.74 EE
Ahmad Rashid 3.74 MBA
James Davis 3.71 ECE
Sam Chu 3.68 ECE
Nabeel Ali 3.56 EE
John Doe 3.54 ECE
Sunil Raj 3.36 ECE
Charles Right 3.31 EECS
Lu John 3.06 CS
Arun Roy 3.06 SS
Jake Zulu 3.00 CS
Pat King 2.77 SS
James Adam 2.77 CS
John Clark 2.68 ECE
John Lee 2.64 EE
Al Davis 2.63 CS
Adam Giles 2.54 SS
Rick Marsh 2.34 CS
然后只需使用head
:
$ count=7
$ sort -k 3 -nr grades | head -n $count
Art Pohm 4.00 ECE
Andy John 3.98 EECS
Diane Rover 3.87 ECE
Tom Nelson 3.81 ECE
Aziz Inan 3.75 EECS
Lee Chow 3.74 EE
Ahmad Rashid 3.74 MBA
如果你想使用gawk
,你可以定义一个array traversal基于一个索引。您可以按照以下方式做一些事情:
awk -v count=7 'function sort_by_num(i1, v1, i2, v2) {
return (v2-v1)
}
{ lines[NR]=$0
idx[NR]=$3
}
END {
asorti(idx, si, "sort_by_num");
for(n = 1; n <= count; ++n) {
print lines[si[n]]
}
}' grades
Art Pohm 4.00 ECE
Andy John 3.98 EECS
Diane Rover 3.87 ECE
Tom Nelson 3.81 ECE
Aziz Inan 3.75 EECS
Ahmad Rashid 3.74 MBA
Lee Chow 3.74 EE
请注意 sort
和我们在 gawk
中为最后两个定义的函数之间的排序顺序差异。您需要在函数中定义具有相同 GPA 值的内容。 gawk
的默认值是稳定的,sort
正在根据其他列执行额外的比较。 (您也可以将 -s
开关添加到 sort
并且输出是相同的)
关于sorting - 最高 awk 结果被计数条件截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42183554/