группировка и сортировка | время последнего входа пользователей

группировка и сортировка | время последнего входа пользователей

У меня есть CSV-файл с датой входа пользователей.

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

Мне нужно в формате ниже.

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

Я пыталсяawk -F, '!a[$1]++', что дает мне первое значение, а не последнее.

решение1

$ 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

Первый sortсортирует данные по пользователю и обратным датам. Вывод этого шага выглядит так

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

Второй вариант sortсортирует только по пользователям и сохраняет только один экземпляр строк каждого пользователя (первый встреченный).

решение2

Как указано в комментариях, этот вопрос уже задавался и было дано несколько ответов. Я хотел бы добавить еще один:

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

Тестовый забег:

$ 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

Объяснение:

Вы уже знаете, как напечатать первое вхождение первого столбца; если вам нужно последнее, вам не нужно больше чесать голову: просто отсортируйте и переверните список с помощью sort -r. В качестве последнего шага, и только если вам нужно, чтобы ваш результат был отсортирован, снова передайте конвейер в sort.


Нет труб:

Вы также можете решить это одной командой. Если входной файл отсортирован (как в вашем примере):

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

в противном случае:

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

Связанный контент