使用 awk 获取列的最大值,对于另一列的每个唯一值
Using awk to get the maximum value of a column, for each unique value of another column
所以我有一个文件,例如:
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 '>max[]{max[]=; row[]=[=10=]} END{for (i in row) print row[i]}' file
输出:
10 3 ghi
20 6 qrs
30 3 tuv
解释:
awk 命令使用关联数组 max
,键为 </code>,值为 <code>
。每次我们遇到一个已经存储在这个关联数组 max
中的值时,我们更新我们之前的条目并将整行存储在另一个具有相同键的关联数组 row
中。最后在 END
部分,我们简单地迭代关联数组 row
并打印它。
sort
的更短替代方案
$ sort -k1,1 -k2,2nr file | sort -u -k1,1
10 3 ghi
20 6 qrs
30 3 tuv
按字段一和字段二(数字,反向)排序,这样每个键的最大值将排在组首,按第二个排序为每个键选择第一个。
所以我有一个文件,例如:
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 '>max[]{max[]=; row[]=[=10=]} END{for (i in row) print row[i]}' file
输出:
10 3 ghi
20 6 qrs
30 3 tuv
解释:
awk 命令使用关联数组 max
,键为 </code>,值为 <code>
。每次我们遇到一个已经存储在这个关联数组 max
中的值时,我们更新我们之前的条目并将整行存储在另一个具有相同键的关联数组 row
中。最后在 END
部分,我们简单地迭代关联数组 row
并打印它。
sort
$ sort -k1,1 -k2,2nr file | sort -u -k1,1
10 3 ghi
20 6 qrs
30 3 tuv
按字段一和字段二(数字,反向)排序,这样每个键的最大值将排在组首,按第二个排序为每个键选择第一个。