最高 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 并且输出相同)