Bash 如何基于一列选择最大值的行,并使用awk按第二列分组?

Bash 如何基于一列选择最大值的行,并使用awk按第二列分组?,bash,awk,gawk,Bash,Awk,Gawk,我的数据如下所示: 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 对于第三列中的每个值,我希望选择第2列中具有最大值的行,并按第1列分组。 所以期望的输出是 1 161 a 1 48 b 1 30 c

我的数据如下所示:

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
对于第三列中的每个值,我希望选择第2列中具有最大值的行,并按第1列分组。 所以期望的输出是

1   161   a
1   48    b
1   30    c
2   1306  d
2   93    e
3   64    e
3   123   f
按列1分组我的意思是我希望得到列1中所有不同值的结果。我试着用的是

awk '$2>max[$3]{max[$3]=$2; row[$3]=$0} 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

这是因为这一行程序仅为第3列中的不同值选择了第2列中的最大值,如何按第1列对其进行分组,以获得第1列中每个值的所需结果?

我认为您可以使用$1$3的复合键:


我认为您可以使用$1$3的复合键:

在评论中,通过一些额外的操作,下面的逻辑将按照OP的要求来实现

sort -r -n -k2 < file| awk '!x[$1 FS $3]++' | sort -k1
这个想法是按照升序对文件进行排序,首先是sort-n-k2,然后在第2列上反转-r,现在是降序 啊!x[$1 FS$3]++该内容的分组是否按第1列和第3列唯一,以及sort-k1是否按第1列内容对其进行排序/分组 在评论中,通过一些额外的操作,下面的逻辑将按照OP的要求来实现

sort -r -n -k2 < file| awk '!x[$1 FS $3]++' | sort -k1
这个想法是按照升序对文件进行排序,首先是sort-n-k2,然后在第2列上反转-r,现在是降序 啊!x[$1 FS$3]++该内容的分组是否按第1列和第3列唯一,以及sort-k1是否按第1列内容对其进行排序/分组
在第二列中查找最大值和最小值的最简单命令分别如下所示

sort-nrk2 data.txt | awk'NR==1{print$2}
sort-nk2 data.txt | awk'NR==1{print$2}'

在第二列中查找最大值和最小值的最简单命令分别如下

sort-nrk2 data.txt | awk'NR==1{print$2} sort-nk2 data.txt | awk'NR==1{print$2}'

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

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保留初始排序顺序。条条大路通罗马。

你可以不用awk就能做到这一点。我不得不使用tr-s来抑制字段/列之间的多个空格分隔符。下面的重要一行是第二行

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保留初始排序顺序。条条大路通罗马。

试试sort-r-n-k2