如何 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
保留初始排序顺序。条条大路通罗马
我的数据如下:
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
保留初始排序顺序。条条大路通罗马