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