在 shell 脚本中显示最高价值的内容

在 shell 脚本中显示最高价值的内容

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 和工资的两个变量。

出于速度的原因,我可能会选择这种方法尽管:

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

这会在第三列上按降序对文件进行数字排序,然后使用 挑选出该结果的第一行head

如果文件使用制表符作为字段分隔符,请使用-t $'\t'with sort。这样,您还可以拥有包含空格的字段。

要仅显示姓名和工资,请使用awk '{ print $1,$3; exit }'代替head -n 1

相关内容