一意のID列で最も一致するものを保持する

一意のID列で最も一致するものを保持する

多くの列を含むタブ区切りのファイルがあります。

1   A   10  1.94E-31       N/A   N/A    bat
1   B   20  1.94E-31       N/A   N/A    bear
1   C   12  1.94E-31       N/A   N/A    dear
1   D   36  1.94E-31       N/A   N/A    quinoa
1   R   55  1.94E-31       N/A   N/A    quinoa
2   E   48  1.94E-31       N/A   N/A    cat
2   F   62  1.94E-31       N/A   N/A    cat
2   G   49  1.94E-31       N/A   N/A    dog
2   H   13  1.94E-31       N/A   N/A    whale
3   I   28  1.94E-31       N/A   N/A    snake
3   J   95  1.94E-31       N/A   N/A    lion
3   K   64  1.94E-31       N/A   N/A    elephant
3   L   38  1.94E-31       N/A   N/A    dog
3   M   19  1.94E-31       N/A   N/A    fox
3   N   97  1.94E-31       N/A   N/A    eagle
3   O   84  1.94E-31       N/A   N/A    parrot
3   P   64  1.94E-31       N/A   N/A    insect
3   Q   13  1.94E-31       N/A   N/A    shark
3   R   49  1.94E-31       N/A   N/A    rat

列3に一意のID数が最も多い行を維持したいと思います。

1   R   55  1.94E-31       N/A   N/A    quinoa
2   F   62  1.94E-31       N/A   N/A    cat
3   N   97  1.94E-31       N/A   N/A    eagle

私の実際のファイルにはヘッダーがあり、列3には小数点を含む数値が含まれています。

ベストアンサー1

$ awk -F'\t' 'NR==1 {print ; next};
              $3 > largest[$1] { largest[$1]=$3; line[$1] = $0 };
              END { for (id in largest) { print line[id] }}' input.txt 
1       R       55      1.94E-31        N/A     N/A     quinoa
2       F       62      1.94E-31        N/A     N/A     cat
3       N       97      1.94E-31        N/A     N/A     eagle

この awk スクリプトは 2 つの配列を使用します。 1つは各ID($ 1)に対して最大値の3ドルを追跡するために使用され、もう1つは関連する入力行を記録するために使用されます。

すべての入力を読み取り、処理した後、id順に行を印刷します。

このNR==1 {print; next};行は最初の行(ヘッダー行)をそのまま印刷し、次の入力行にジャンプします。

おすすめ記事