我有一个包含许多列的制表符分隔文件:
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 脚本使用两个数组,一个用于跟踪每个 id ($1) 的最大值 $3,第二个用于记录关联的输入行。
读取并处理所有输入后,它会按 id 顺序打印出各行。
该NR==1 {print; next};
行仅逐字打印出第一行(标题行),然后跳到下一个输入行。