Bash 对于另一列的每个唯一值,使用awk获取一列的最大值

Bash 对于另一列的每个唯一值,使用awk获取一列的最大值,bash,sorting,awk,uniq,Bash,Sorting,Awk,Uniq,因此,我有一个文件,例如: 10 1 abc 10 2 def 10 3 ghi 20 4 elm 20 5 nop 20 6 qrs 30 3 tuv 我想为第一列的每个值获取第二列的最大值,即: 10 3 ghi 20 6 qrs 30 3 tuv 如何使用awk或类似的unix命令?您可以使用awk: awk '$2>max[$1]{max[$1]=$2; row[$1]=$0} END{for (i in row) print row[i]}' file 输出: 10 3 g

因此,我有一个文件,例如:

10 1 abc
10 2 def
10 3 ghi
20 4 elm
20 5 nop
20 6 qrs
30 3 tuv
我想为第一列的每个值获取第二列的最大值,即:

10 3 ghi
20 6 qrs
30 3 tuv

如何使用
awk
或类似的unix命令?

您可以使用
awk

awk '$2>max[$1]{max[$1]=$2; row[$1]=$0} END{for (i in row) print row[i]}' file
输出:

10 3 ghi
20 6 qrs
30 3 tuv
说明:

10 3 ghi
20 6 qrs
30 3 tuv

awk命令使用一个关联数组
max
,其中键为
$1
,值为
$2
。每当我们遇到一个已经存储在此关联数组中的值时,我们都会更新以前的条目,并使用相同的键将整行存储在另一个关联数组中。最后,在
END
部分中,我们只需迭代关联数组
,并将其打印出来。

使用
排序的较短备选方案

$ sort -k1,1 -k2,2nr file | sort -u -k1,1

10 3 ghi
20 6 qrs
30 3 tuv

按字段1和字段2(数字,反向)排序,使每个键的最大值位于组的顶部,按第二个排序为每个键选择第一个。

这给出了要求的内容。我建议每行最多只存储
$0
,而不是
$3
。这将简化最后的打印,并适用于多个大于3的字段(甚至是可变数量的字段)。非常感谢@anubhava的快速回答。你能解释一下代码吗?另外,感谢e0k的概括,它对我的需求非常有用。在答案中添加了一个解释。行是否总是以第二列的递增顺序排列,而第一列总是以公共值排列在一起?