agrupar y ordenar | hora del último inicio de sesión de los usuarios

agrupar y ordenar | hora del último inicio de sesión de los usuarios

Tengo un archivo csv para la fecha de inicio de sesión de los usuarios.

user1,2019-05-21
user1,2019-05-22
user1,2019-05-23
user2,2019-05-20
user2,2019-05-21
user3,2019-05-24
user3,2019-05-29
user4,2019-05-25
user4,2019-05-28

Lo necesito en el siguiente formato.

user1,2019-05-23
user2,2019-05-21
user3,2019-05-29
user4,2019-05-28

Lo intentéawk -F, '!a[$1]++', lo que me da el primer valor, no el último.

Respuesta1

$ sort -t, -k1,1 -k2,2r file | sort -t, -u -k1,1
user1,2019-05-23
user2,2019-05-21
user3,2019-05-29
user4,2019-05-28

El primero sortordena los datos por usuario e invierte fechas. El resultado de ese paso parece

user1,2019-05-23
user1,2019-05-22
user1,2019-05-21
user2,2019-05-21
user2,2019-05-20
user3,2019-05-29
user3,2019-05-24
user4,2019-05-28
user4,2019-05-25

El segundo sortordena solo a los usuarios y mantiene solo una instancia de las líneas de cada usuario (la primera encontrada).

Respuesta2

Como se señaló en los comentarios, esto se ha preguntado antes y se han proporcionado varias respuestas. Me gustaría agregar uno más:

sort -r input.csv | awk -F, '!a[$1]++' | sort

Prueba de funcionamiento:

$ sort -r input.csv | awk -F, '!a[$1]++' | sort
user1,2019-05-23
user2,2019-05-21
user3,2019-05-29
user4,2019-05-28

Explicación:

Ya sabes cómo imprimir la primera aparición de la primera columna; si quieres lo último, no necesitas rascarte más la cabeza: simplemente ordena e invierte la lista con sort -r. Como último paso, y solo si necesita ordenar el resultado, vuelva a dirigirlo a sort.


Sin tuberías:

También puedes solucionar esto con un solo comando. Si el archivo de entrada está ordenado (como está su ejemplo):

awk -F, '{a[$1]=$2}END{for(k in a){print k","a[k]}}' input.csv

de lo contrario:

awk -F, '$2>a[$1]{a[$1]=$2}END{for(k in a){print k" "a[k]}}' input.csv

información relacionada