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

时间:2016-01-28 18:18:54

标签: 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命令?

2 个答案:

答案 0 :(得分:7)

您可以使用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

<强>解释

awk命令使用关联数组max,关键字为$1,值为$2。每当我们遇到已存储在此关联数组max中的值时,我们就会更新前一个条目并将整行存储在另一个具有相同键的关联数组row中。最后在END部分,我们简单地遍历关联数组row并打印它。

答案 1 :(得分:6)

使用sort

的较短替代方案
$ sort -k1,1 -k2,2nr file | sort -u -k1,1

10 3 ghi
20 6 qrs
30 3 tuv

按字段1和字段2(数字,反向)排序,以便每个键的最大值将位于组的顶部,然后通过第二种键为每个键选择第一个键。