シェルスクリプトで最も高い値のコンテンツを表示する

シェルスクリプトで最も高い値のコンテンツを表示する

Record.txtには次の情報があります。

Nosi IT 3000
David HR 4000

awk やその他の機能を備えたツールを使用して、最高給与を受け取る従業員の給与を表示するにはどうすればよいですか。 records.txtに保存されている場合。 David 4000を見せたいです。

答え1

使いやすいGNUdatamash:

$ datamash -Wf max 6 < record.txt | cut -f 4,6
David   4000

datamash列6で最も高い値を持つ行を印刷し、目的の列のみを取得するためにcut使用されます。

答え2

バージョン:

awk 'NF && $3>max {max=$3; id=$1} END {print id" "max}' records.txt

「フィールドを含む行(=空ではありません)で、給与が現在保存されている最大値(デフォルト値0)よりも高い場合は、保存された最大値とチャンピオン名を更新します。すべての行が表示されると処理されました(= END)。IDと給与が含まれます2つの変数をダンプします。

速度上の理由で、おそらくこのアプローチを選択します。しかし:

sort -k 3 -n -r records.txt | head -n 1

答え3

を使用するには、入力awkしたサンプル入力に対して次のことが必要です。

awk 'NF==0 {next} !name {max=$3; name=$1} {if ($3>max) {max=$3; name=$1};} END{printf("%s : %d\n",name,max)}' records.txt

空の行をスキップし、空でない最初の行のデータで最大値maxとその名前(変数として表示name0つまりここで文字列が必要な場合は初期化されません)を初期化します。現在の給与よりも大きい給与が見つかった場合は、それを次の(空ではない)行の対応する値に置き換えますmax。最後に、名前と値を印刷します。

より短いバージョン、Stephen KittおよびAlex Stragiesによって提供されるように:

awk 'NF>0 && (!name || $3>max) {max=$3; name=$1} END {printf("%s : %d\n",name,max);}' records.txt

これは、空でない最初の行と3番目の列の値がより大きいすべての行に対してmax設定とが等しいという事実を利用します。空白行をスキップすることを最初に実行するための前提条件として、必要に応じて簡単に統合することもできます。namemaxNF>0

答え4

$ sort -k3,3rn file | head -n 1
David HR 4000

これは、ファイルを3列目の降順で数字でソートし、その結果の最初の行を使用して選択しますhead

ファイル内のタブをフィールド区切り文字として使用する場合は、-t $'\t'withを使用してくださいsort。これにより、スペースを含むフィールドを持つこともできます。

名前と給与のみを表示するには、代わりにawk '{ print $1,$3; exit }'を使用してくださいhead -n 1

関連情報