数据集如下
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
只输出最大的一个,而不是同时输出b
和e
。
期望的输出是
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 }
。