gpt4 book ai didi

sorting - 最高 awk 结果被计数条件截断

转载 作者:行者123 更新时间:2023-12-02 03:06:48 27 4
gpt4 key购买 nike

我有一个学生记录列表,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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com