awk remove as linhas com base em outro valor de coluna

4

Eu tenho um arquivo como abaixo, que eu classifiquei com base no campo de nome de usuário.

UserID score UserName
1234    200   Jack
5678    150   Jill
8543    200   Jill 
5678    100   John

Estou tentando remover as linhas que têm a pontuação mais baixa para os mesmos nomes de usuários. Então, eu quero ter a saída como,

UserID score UserName
1234    200   Jack
8543    200   Jill 
5678    100   John
    
por Ramesh 13.03.2014 / 17:13

3 respostas

4

A abordagem mais simples seria classificar no campo de pontuação:

$ sort -nk2 file | awk '{k[$NF]=$0} END{for (i in k){print k[i]}}'
UserID score UserName
8543    200   Jill 
1234    200   Jack
5678    100   John

Ou, em perl :

sort -nk2 file | perl -ane '$k{$F[$#F]}=$_; END{print "$k{$_}" for keys(%k)}'

O -a flag para perl ativa a divisão automática, basicamente, ele se comportará como awk e dividirá cada linha no espaço em branco, salvando os campos na matriz @F . O -n significa processar a linha do arquivo de entrada, por linha.

$F[$#F] é o último elemento de @F , portanto, o último campo: o nome de usuário. $k{$F[$#F]}=$_; salva cada linha no hash %k , onde as chaves são os nomes de usuários, sobrescrevendo o que estava lá antes. Como primeiro classificamos o arquivo, isso significa que $k{username} será a pontuação mais alta para a entrada desse nome de usuário. No final, imprimimos cada linha salva em %k .

    
por 13.03.2014 / 17:43
4

Tente isto:

awk 'NR==1{print $1,$2,$3};NR!=1{if($2>a[$3]){a[$3]=$2;b[$3]=$1}}
    END{for(x in a){print b[x],a[x],x}}' OFS="\t" file

UserID  score   UserName
1234    200     Jack
8543    200     Jill
5678    100     John

Ou usando perl :

perl -ane '$h{$F[$#F]}=[$F[$#F-1],"$_"] if $F[$#F-1] > $h{$F[$#F]}->[0];
    END{print "$h{$_}->[1]" for keys %h}' file
    
por 13.03.2014 / 17:48
3

Uma alternativa sem arrays :

$ awk '
seen == $NF {line = (ishigh > $2) ? line : $0; next}
line {print line}
{seen = $NF; ishigh = $2; line = $0}
END {print line}' file
UserID score UserName
1234    200   Jack
8543    200   Jill
5678    100   John
    
por 14.03.2014 / 06:31

Tags