如果可能的话,我正在寻找一个简单的解决方案来解决这个问题。我想我可以设法在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
答案 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
注意:输出可能无序