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

标签 sorting awk command-line gawk

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

相关文章:

algorithm - 每次查询后的最大矩形大小(算法)

iOS 确定 NSMutableArray sortUsingComparator 何时完成

python - 按长度对列表列表进行排序时跟踪原始索引

javascript - 如何将 true 或 false 的 const 列表排序为两个单独的数组,一个包含 true 对象,另一个包含 false 对象?

java - 从 Java 交互调用 bash

csv - 重击 : Add empty column(s) to CSV with unknown positions

linux - 如何在没有空格的情况下打印 awk?

command-line - 在命令行中使用 swipl 运行 prolog 代码

visual-studio - 乌龟SubWCRev.exe生成前事件

java - 如何从另一个方法返回方法 - 控制台命令界面