2017-02-12 5 views
3

学生レコードのリストgradesがあります.GPAで並べ替え、上位5個の結果を返します。なんらかの理由でcount<=7以下では、結果のトップを切り捨てます。私はそれがなぜあるのか理解できません。awkの結果がカウント条件で切り捨てられます

また、並べ替え後に最初の列を削除すると、結果が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'にジャンプします。私は最初に気付かなかったのです。 –

関連する問題