从每个连续编号的子组/族的文本文件中提取包含给定列中最高值的单行

从每个连续编号的子组/族的文本文件中提取包含给定列中最高值的单行

在我的文本文件中,我想从第 2 列中的每个连续编号的族(即 family_1、family_2 等)中取出包含第 3 列中存在的最高值的行,并将这些数据输入到新的文本文件中。

输入数据:

TTGSCA  family_1    18.123083   681 36349   1
TTGSCA  family_1    18.123083   681 36349   1
CTTRAG  family_2    17.844843   685 37001   1
CTYAAG  family_2    16.95983    657 36170   1
.GCCAAR family_3    19.436863   698 35844   1
WGCCAA. family_3    19.99668    747 38506   1
.GCCAAS family_3    17.037859   599 31922   1
WGCCAA. family_3    19.99668    747 38506   1
CCACTK  family_4    17.200712   776 44550   1
CCACTY  family_4    18.86465    727 38616   1
MCACTT  family_4    18.0871 737 40399   1
MCACTT  family_4    18.0871 737 40399   1
YCACTT  family_4    19.369513   804 43376   -1
CCAYTT  family_4    16.193245   752 44296   1
CCAYTT  family_4    16.193245   752 44296   1
SCACTT  family_4    19.759317   687 34686   1

输出数据:

TTGSCA  family_1    18.123083   681 36349   1
CTTRAG  family_2    17.844843   685 37001   1
WGCCAA. family_3    19.99668    747 38506   1
SCACTT  family_4    19.759317   687 34686   1

我不确定是否使用 grep 还是 awk,以及如何将它们组合成一个函数。

答案1

GNU 数据混合(以及来自的一点帮助cut):

$ datamash -Wf groupby 2 max 3 < file.txt | cut -f1-6
TTGSCA  family_1    18.123083   681 36349   1
CTTRAG  family_2    17.844843   685 37001   1
WGCCAA. family_3    19.99668    747 38506   1
SCACTT  family_4    19.759317   687 34686   1

答案2

我认为datamash这可能是最好的工具,但这里有一个独特的替代方案:

<infile sort -k2,2V -k3,3n | awk 'NR==1 || $2!=p; { p=$2 }'

答案3

下面是比我之前的答案更干净的获得所需输出的方法。它确实需要使用两次,但比使用、、 和使用四次 sort要好得多。sortgreptail

sort -k3r numbers | awk '!seen[$2]++' | sort -k2

输出:

TTGSCA  family_1    18.123083   681 36349   1
CTTRAG  family_2    17.844843   685 37001   1
WGCCAA. family_3    19.99668    747 38506   1
SCACTT  family_4    19.759317   687 34686   1

相关内容