Obter linhas com valores máximos na coluna usando awk, uniq e sort

6

Eu tenho um arquivo com o próximo formato

2011-12-01 user1 access1
2011-12-01 user1 access2
2011-12-01 user2 access2
2011-12-01 user4 access2
2011-12-02 user1 access1
2012-01-01 user3 access1
2012-01-01 user4 access2

Eu gostaria de ter uma saída que para cada usuário mostre a última data, então

2011-12-02 user1 access1
2011-12-01 user1 access2
2011-12-01 user2 access2
2012-01-01 user3 access1
2012-01-01 user4 access2

Eu tentei algo assim:

less myfile.txt | sort -k1r | uniq -f 1  | sort -b -k1

mas não parece funcionar corretamente.

Obrigado pela ajuda!

    
por gakhov 25.01.2012 / 13:36

3 respostas

6

Eu acho que você quer

cat myfile.txt| sort -k1 -r | sort --unique --stable -k2,3

(veja meu comentário sobre cat acima). O primeiro tipo colocará as datas mais recentes no topo. A segunda classificação classificará por usuário + acesso, mas, dando --stable , manterá a ordem anterior de linhas que possuem a mesma combinação usuário + acesso, ou seja, a mais nova ainda no topo. Dando --unique , apenas a primeira linha de uma execução com combinação de usuário + acesso igual é mostrada. (Você pode substituí-lo por | uniq -f1 , eu acho, se for uma extensão do GNU que seu tipo não tem).

    
por 25.01.2012 / 13:49
6

Você está quase lá, só precisa ajustar as opções sort :

sort -k2,2 -k1,1r myfile.txt | uniq -f1

Ou seja: classifique por usuário e data reversa, deixe apenas a primeira aparição do usuário + acesso.

    
por 25.01.2012 / 13:55
4

Se você quiser fazer isso apenas com uma única chamada para awk

awk '($1 > a[$2,$3]){a[$2,$3]=$1}END{for(x in a){split(x,b,SUBSEP);print a[x],b[1],b[2]}}' in
    
por 25.01.2012 / 18:04