如何 select 具有基于一列的最大值的行,并使用 awk 按第二列进行分组?

how to select rows with max value based on one column and group by second column using awk?

我的数据如下:

1   161   a
1   48    b
1   30    c
2   199   d 
2   1306  d
2   1290  d
2   81    d
2   51    e
2   82    e
2   93    e
3   64    e
3   99    f
3   123   f

对于第 3 列中的每个值,我想 select 在第 2 列中具有最大值的行并按第 1 列分组。 所以期望的输出是

1   161   a
1   48    b
1   30    c
2   1306  d
2   93    e
3   64    e
3   123   f

按第一列分组我的意思是我想要第 1 列中所有不同值的结果。我尝试使用的是

awk '>max[]{max[]=; row[]=[=13=]} END{for (i in row) print row[i]}' file

我得到以下结果

1   161   a
1   48    b
1   30    c
2   1306  d
2   93    e
3   123   f

但我在结果中遗漏了下一行

3   64  e

这是因为这个衬里 select 只是第 3 列中不同值的第 2 列中的最大值,我如何按第 1 列对其进行分组以获得中每个值的所需结果第 1 列?

我想你可以使用 </code>:</p> 的组合键 <pre><code>awk ' > max[] { max[]=; row[]=[=10=] } END { for (i in row) print row[i] }' file

在评论中感谢 sofan's 的想法,通过一些额外的操作,下面的逻辑将按照 OP 的要求进行操作。

sort -r -n -k2 < file| awk '!x[ FS ]++' | sort -k1
  • 想法是首先按升序 (sort -n -k2) 对文件进行排序,然后在第 2 列(现在将按降序排列)将其反转 (-r)
  • awk '!x[ FS ]++ 对第 1 列和第 3 列唯一的内容进行分组,sort -k1 sorts/groups 按第 1 列的内容

在第二列中找到最大值和最小值的最简单命令分别是这样的

排序-nrk2 data.txt |哇 'NR==1{print }' 排序-nk2 data.txt | awk 'NR==1{print }'

您可以在没有 awk 的情况下执行此操作。我不得不使用 tr -s " " 来抑制 fields/columns 之间的多个空白分隔符。下面重要的是第二行。

cat $file | tr -s " " \
| sort -k2nr,2 | sort -k1,1 -k3,3 -u | sort -k3,3 -k1,1 -k2nr,2 \
| tr " " "\t"

其实最后的-k2nr,2根本就没有必要。您可以只使用 --stable 保留初始排序顺序。条条大路通罗马