私のテキストファイルでは、列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つの機能に組み合わせる方法がわかりません。
答え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
以前の答えよりも望ましい出力を得るためのよりきれいな方法があります。 2回使用する必要がありますが、および4回使用するよりもはるかに優れています 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