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