在我的文本文件中,我想从第 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
要好得多。sort
grep
tail
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