多くの列を含むタブ区切りのファイルがあります。
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};
行は最初の行(ヘッダー行)をそのまま印刷し、次の入力行にジャンプします。