最高 awk 结果被计数条件截断
Top awk result cut off with count condition
我有一个学生记录列表,grades
,我想按 GPA 排序,返回前 5 个结果。由于某种原因 count<=7
及以下会截断顶部结果。我不明白为什么会这样。
此外,是否有比将结果从 sort
传送回 awk
更优雅的方法来删除排序后的第一列?
user@machine:~> awk '{ if (count<=7) print , [=10=]; count++; }' grades | sort -nr | awk '{ print " " " " " " }'
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 , [=10=]; count++; }' grades | sort -nr | awk '{ print " " " " " " }'
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]=[=12=]
idx[NR]=
}
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
并且输出相同)
我有一个学生记录列表,grades
,我想按 GPA 排序,返回前 5 个结果。由于某种原因 count<=7
及以下会截断顶部结果。我不明白为什么会这样。
此外,是否有比将结果从 sort
传送回 awk
更优雅的方法来删除排序后的第一列?
user@machine:~> awk '{ if (count<=7) print , [=10=]; count++; }' grades | sort -nr | awk '{ print " " " " " " }'
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 , [=10=]; count++; }' grades | sort -nr | awk '{ print " " " " " " }'
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]=[=12=]
idx[NR]=
}
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
并且输出相同)