データセットは次のとおりです。
name score
a 10
b 20
c 5
d 15
e 20
目標は、最高のスコアを持つすべての名前を出力することです。共通の最大スコアを持つ名前が複数ある場合は、すべての名前を出力します。可能であれば、grep、sort、cut、headのみを使用してください。
現在は合計tail -n +2 sources.txt | sort -k 2,2nr | cut -d ' ' -f 1 | head -1
ではなく最大のものだけを出力します。b
e
希望の出力は
b
e
答え1
$ awk 'FNR == 1 { next };
FNR == NR { if ($2 > max) { max = $2 } ; next };
$2 == max { print $1 }' sources.txt sources.txt
b
e
このawkは1行で入力ファイルを読み取ります(sources.txt
)。二重(それでコマンドラインで2回指定する必要があります。)最初は2番目のフィールド($ 2)の最大値を見つけて変数に保存し、2番目はmax
$ 2が等しい場合は最初のフィールド($ 1)を印刷しますmax
。
2つの組み込みawk変数を使用します。 FNR
常に現在のファイルの行番号と同じで、NR
すべての入力の現在の行番号(累積合計)と常に同じです。したがって、この場合はFNR == NR
最初のファイルを読み取り、裏側FNR != NR
です。いいえ最初のファイルを読みます。空のファイルはまったく計算されないため、入力ファイルのいずれかが空の場合、正しく機能しません。空のファイルには行がないため、計算する項目はありません。
両方とも入力の最初の行(ヘッダー行)を無視しますFNR == 1 { next }
。