【问题标题】:Top awk result cut off with count condition顶部 awk 结果被计数条件截断
【发布时间】:2017-06-30 05:28:53
【问题描述】:

我有一个学生记录列表grades,我想按 GPA 排序,返回前 5 个结果。出于某种原因,count<=7 及以下会切断顶部结果。我不知道为什么会这样。

另外,有没有比将结果从sort 传送回awk 更优雅的方法来在排序后删除第一列?

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

【问题讨论】:

  • 如果您为 count 的值添加调试语句,您可能会看到您的问题所在。祝你好运。

标签: sorting awk command-line gawk


【解决方案1】:

在这种情况下,您实际上不需要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,输出是一样的)

【讨论】:

  • 是的,我刚刚意识到使用awk 不是该问题的要求。我仍然很好奇为什么awk 会这样。 count&lt;=8 也从 4.00 跳转到 3.74,我一开始并没有注意到。
猜你喜欢
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
相关资源
最近更新 更多