在具有重复ID的列中保留具有最高值的行

时间:2014-02-26 16:49:27

标签: shell command-line awk

如果可能的话,我正在寻找一个简单的解决方案来解决这个问题。我想我可以设法在python中完成它,但我确信有一种更简单的方法。我正在处理数百条记录,但这可能会扩展到数百万条。

我有一个包含多个字段的行列表。 id(第一列)重复几次,其他一些列可以变化。我只想保留一个唯一ID,特别是在特定列中具有最高值的ID,同时保留所选行的其余字段。即:

ID1 55 blue 4.5
ID1 57 red 4.3
ID2 65 orange 3.1
ID2 66 orange 3.2
ID2 90 orange 3.1
ID3 60 blue 4.5

如果我想根据第二栏过滤这些数据:

ID1 57 red 4.3
ID2 90 orange 3.1
ID3 60 blue 4.5

4 个答案:

答案 0 :(得分:2)

GNU排序

$ cat file
ID1 55 blue 4.5
ID1 57 red 4.3
ID2 65 orange 3.1
ID2 66 orange 3.2
ID2 90 orange 3.1
ID3 60 blue 4.5

$ sort -k 1,1 -k 2,2nr file | sort -u -t' ' -k1,1
ID1 57 red 4.3
ID2 90 orange 3.1
ID3 60 blue 4.5

答案 1 :(得分:1)

awk '
    $2 > max[$1] {max[$1] = $2; line[$1] = $0} 
    END {for (id in line) print line[id]}
' file

或者,首先按ID排序,然后按值降序排序,只在看到新ID时打印该行:

sort -k 1,1 -k 2,2nr file | awk '!seen[$1]++'

此方法将确保输出按ID排序。

答案 2 :(得分:1)

假设输入文件在ID字段上排序,这将按顺序返回记录

awk '$1 != prevID && NR > 1{print content[prevID]};
    $2 > max[$1] {max[$1]=$2; content[$1]=$0}; {prevID=$1};
    END{print content[prevID]}' file

答案 3 :(得分:0)

您可以尝试这样的事情:

awk '($1 in a){b[$1] = ($2 > a[$1]) ? $0 : b[$1]; next}
     {a[$1] = $2; b[$1] = $0}
     END{for(x in b) print b[x]}' file

$ awk '($1 in a){b[$1] = ($2 > a[$1]) ? $0 : b[$1]; next}
{a[$1] = $2; b[$1] = $0}
END{for(x in b) print b[x]}' file
ID1 55 blue 4.5
ID2 90 orange 3.1
ID3 60 blue 4.5

注意:输出可能无序