如何使用BASH输出所有共享的top值

如何使用BASH输出所有共享的top值

数据集如下

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只输出最大的一个,而不是同时输出be

期望的输出是

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 单行读取输入文件 ( sources.txt)两次(这就是为什么必须在命令行上指定两次)。第一次找到第二个字段($2)的最大值并将其存储在变量 中max,第二次当 $2 等于 时打印第一个字段($1)max

它使用两个内置 awk 变量。 FNR始终等于当前文件的行号,并且NR始终等于所有输入的当前行号(累计总数)。所以,当 时FNR == NR,它正在读取第一个文件,当 时FNR != NR,它是不是读取第一个文件。请注意,如果任何输入文件为空,则此操作将无法正常工作,因为空文件根本不被计算在内(空文件中没有行,因此没有任何内容可计算)。

它两次都会忽略输入的第一行(标题行)FNR == 1 { next }

相关内容