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
这会在第三列上按降序对文件进行数字排序,然后使用 挑选出该结果的第一行head
。
如果文件使用制表符作为字段分隔符,请使用-t $'\t'
with sort
。这样,您还可以拥有包含空格的字段。
要仅显示姓名和工资,请使用awk '{ print $1,$3; exit }'
代替head -n 1
。