2017-02-12 27 views
3

У меня есть список студенческих записей, grades, которые я хочу отсортировать по GPA, вернув 5 лучших результатов. По какой-то причине count<=7 и ниже отсекает верхний результат. Я не могу понять, почему это так.Top awk result cut off with count condition

Кроме того, существует ли более элегантный способ удалить первый столбец после сортировки, чем результаты трубопроводов, полученные до awk от sort?

[email protected]:~> 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 

[email protected]:~> 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 
+0

если вы добавите инструкцию отладки для значения 'count', вы можете увидеть, в чем проблема. Удачи. – shellter

ответ

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, и выход будет идентичным)

+0

Да, я просто понял, что использование awk не было требованием для этого вопроса. Мне все еще интересно, почему 'awk' ведет себя так. 'count <= 8' перескакивает с' 4.00' на '3.74', что я не заметил вначале. –