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 sort
ordena 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 sort
ordena 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