그룹화 및 정렬 | 사용자 마지막 로그인 시간

그룹화 및 정렬 | 사용자 마지막 로그인 시간

사용자의 로그인 날짜를 기록하는 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를 사용하고 목록을 반대로 하면 됩니다 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

관련 정보