Obtenez des lignes avec les valeurs maximales dans la colonne en utilisant awk, uniq et sorting

J'ai un file au format suivant

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 

Je voudrais avoir une sortie qui pour chaque user montre la dernière date, donc

 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 

J'ai essayé quelque chose comme ça:

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

mais il ne semble pas fonctionner correctement.

Merci pour l'aide!

Je pense que tu veux

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

(voir mon commentaire concernant le cat ci-dessus). Le premier sorting mettra les dates les plus récentes au sumt. Le second sorting --stable par user + access, mais, en donnant --stable , gardera l'ordre précédent des lignes qui ont la même combinaison d'user + d'access, c.-à-d. Le plus récent toujours au sumt. Giving --unique , seule la première ligne d'un run avec la combinaison user + access est affichée. (Vous pouvez le replace par | uniq -f1 , je pense, s'il se trouve qu'il s'agit d'une extension GNU que votre sorting n'a pas.)

Vous êtes presque là, juste besoin d'ajuster les options de sort :

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

C'est: sortinger par user et date inverse, ne laisser que la première apparition de l'user + access.

Si vous voulez le faire juste avec un seul appel à 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