![группировка и сортировка | время последнего входа пользователей](https://rvso.com/image/154476/%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%20%D0%B8%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%20%7C%20%D0%B2%D1%80%D0%B5%D0%BC%D1%8F%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B5%D0%B3%D0%BE%20%D0%B2%D1%85%D0%BE%D0%B4%D0%B0%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%B9%20.png)
У меня есть 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