
사용자의 로그인 날짜를 기록하는 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