最高得点のアイテムを出力

最高得点のアイテムを出力

以下のファイルがあります。スコア列に基づいて、以下のように行全体を出力して、被験者ごとのスコアが最も高い人を出力したいと思います。特定の順序は必要ありませんが、件名列にはすべての一意の項目を含める必要があります。

name subject score remarks
john   Math    67   satis
lewis  History 56   poor
sarah  Math    89   good
fiona  Geo     65   satis
george History 99   very good

希望の出力:

name   subject score remarks
sarah  Math    89   good
george History 99   very good
fiona  Geo     65   satis

すべての列はタブで区切られ、メモ列にはスペースで区切られた単語があります。同じ科目に同じスコアがある場合は、すべて出力したいと思います。

ベストアンサー1

それは次のとおりです。

{
head -n 1 file.txt &&
tail -n+2 file.txt |
sort -t $'\t' -nrk 3 |
awk -F '\t' 's[$2] && s[$2] > $3 { next }{ s[$2] = $3 } 1'
} >outfile.txt
  • head -n1タイトルを印刷してください。

  • tail -n+2処理のためにヘッダーとパイプラインの残りの部分をスキップします。

  • sort数字を逆順に並べ替えます(高い順から低い順に)(-rn)。入力の3番目の列()で-k 3並べ替え、タブで区切ります(-t $'\t'名前またはタイトル列にスペースがない場合は - を削除できます)。

  • awkタイトルが表示されない場合、または最後の行と同じ場合は、その行を印刷します。
    -F '\t'フィールド区切り記号をタブに設定します。名前とタイトルの列にスペースがない場合は削除できます。

    • s[$2] && s[$2] > $3 { next }次へ。s[subject]これが設定されており、現在の値(最高スコア)より大きい場合です。
    • {s[$2] = 1}置くs[subject] = score
    • 1印刷

最後の行のタイトルが気に入らず、考える必要もないなら名前またはトピックスペースを含む(例:なし) - 次のように短縮できます。

sort -nrk3 file.txt | awk ' s[$2] && s[$2] > $3{next}{s[$2]=$3}1'

おすすめ記事