Filtrando a linha com o maior valor para um determinado ID

1

Eu tenho um arquivo tabular no qual a primeira coluna tem IDs e a segunda tem valores numéricos. Eu preciso gerar um arquivo que contenha apenas a linha com a maior pontuação para cada ID.

Então, eu quero entender isso:

ES.001      2.33
ES.001      1.39
ES.001    119.55
ES.001     14.55
ES.073      0.35
ES.073     17.95
ES.140      1.14
ES.140     53.88
ES.140     18.28
ES.178    150.27

E gere isso:

ES.001    119.55
ES.073     17.95
ES.140     53.88
ES.178    150.27

Existe uma maneira de fazer isso a partir de uma linha de comando bash?

    
por apcamargo 07.12.2016 / 02:56

2 respostas

1

Dependendo do tipo de dados, a classificação pode levar muito tempo. Podemos obter o resultado sem ordenar (mas usando mais memória) assim:

awk 'a[$1]<$2{a[$1]=$2}END{for(i in a){print(i,a[i])}}' infile
    
por 07.12.2016 / 03:42
3

Use sort para classificá-los pelo primeiro campo e, depois, pelo segundo campo em ordem numérica descendente. Use o Awk para imprimir apenas a primeira linha para cada primeiro valor de campo distinto.

sort -k1,1 -k2rn inputfile | awk '!a[$1]++'
    
por 07.12.2016 / 03:06