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
答え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
とその名前(変数として表示name
、0
つまりここで文字列が必要な場合は初期化されません)を初期化します。現在の給与よりも大きい給与が見つかった場合は、それを次の(空ではない)行の対応する値に置き換えます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
設定とが等しいという事実を利用します。空白行をスキップすることを最初に実行するための前提条件として、必要に応じて簡単に統合することもできます。name
max
NF>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
。