連続して番号付けされた各サブグループ/グループについて、テキストファイルから指定された列の最高値を含む単一の行を抽出します。

連続して番号付けされた各サブグループ/グループについて、テキストファイルから指定された列の最高値を含む単一の行を抽出します。

私のテキストファイルでは、列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回使用するよりもはるかに優れています sortsortgreptail

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

関連情報