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

leo*_*hel 3 sorting bash awk uniq

所以我有一个文件,如:

10 1 abc
10 2 def
10 3 ghi
20 4 elm
20 5 nop
20 6 qrs
30 3 tuv
Run Code Online (Sandbox Code Playgroud)

我想为第一列的每个值获取第二列的最大值,即:

10 3 ghi
20 6 qrs
30 3 tuv
Run Code Online (Sandbox Code Playgroud)

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

anu*_*ava 7

你可以使用awk:

awk '$2>max[$1]{max[$1]=$2; row[$1]=$0} END{for (i in row) print row[i]}' file
Run Code Online (Sandbox Code Playgroud)

输出:

10 3 ghi
20 6 qrs
30 3 tuv
Run Code Online (Sandbox Code Playgroud)

说明:

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

  • 这给出了要求.我建议为每条最大线存储"$ 0"而不是"$ 3".这将简化最后的打印,并且可以用于多个字段> 3(甚至是可变数量的字段). (2认同)

kar*_*kfa 6

更短的替代品 sort

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

10 3 ghi
20 6 qrs
30 3 tuv
Run Code Online (Sandbox Code Playgroud)

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