保留uniq ID列中的最高匹配项

保留uniq 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 脚本使用两个数组,一个用于跟踪每个 id ($1) 的最大值 $3,第二个用于记录关联的输入行。

读取并处理所有输入后,它会按 id 顺序打印出各行。

NR==1 {print; next};行仅逐字打印出第一行(标题行),然后跳到下一个输入行。

相关内容