다음 형식의 두 개의 csv 파일이 있습니다.
column1,column2,user,column4,column5,column...column14
사용자를 첫 번째 키로 기준으로 파일을 정렬한 다음 타임스탬프를 나타내는 숫자인 컬럼 14를 기준으로 내림차순으로 정렬하고 싶습니다.
결과는 다음과 같습니다:
파일 1:
A,AA,jim,XX,YY,....,1485771395
A,AA,jim,XX,YY,....,1485771395
등
그런 다음 이 파일에서 각 클러스터의 첫 번째 줄만 유지하고 싶습니다.
A,AA,jim,XX,YY,....,1485771395
어떻게 해야 하나요?
고쳐 쓰다:
입력 예:
"1/30/2017 11:14:55 AM",Valid customer,jim.smith,NY,1485771295
"1/26/2017 5:06:11 AM",New customer,john.doe,CA,1485403571
"1/26/2017 8:02:01 PM",Valid customer,jim.smith,NY,1485457321
"1/30/2017 4:14:30 AM",New customer,tim.jones,CO,1485746070
"1/30/2017 11:09:36 AM",New customer,tim.jones,CO,1485770976
"1/30/2017 11:14:50 AM",Valid customer,jim.smith,NY,1485771290
"1/22/2017 11:51:51 AM",New customer,tim.jones,CO,1485082311
마지막 열은 첫 번째 열의 시대이므로 문자열이 아닌 숫자를 사용하여 행을 정렬할 수 있습니다.
따라서 예상되는 출력은 다음과 같습니다.
a) 이름과 타임스탬프를 기준으로 역순으로 정렬하면 다음과 같은 결과를 얻습니다.
"1/30/2017 11:14:55 AM",Valid customer,jim.smith,NY,1485771295
"1/30/2017 11:14:50 AM",Valid customer,jim.smith,NY,1485771290
"1/26/2017 8:02:01 PM",Valid customer,jim.smith,NY,1485457321
"1/26/2017 5:06:11 AM",New customer,john.doe,CA,1485403571
"1/30/2017 11:09:36 AM",New customer,tim.jones,CO,1485770976
"1/30/2017 4:14:30 AM",New customer,tim.jones,CO,1485746070
"1/22/2017 11:51:51 AM",New customer,tim.jones,CO,1485082311
jim.smith
따라서 마지막 열을 기준으로 역순으로 정렬 된 행 클러스터가 있고 tim.jones
(즉, 첫 번째 행의 가장 늦은 날짜가 클러스터의 첫 번째 날짜임) john.doe
해당 행에 대한 레코드는 1개뿐입니다.
그런 다음 각 클러스터의 첫 번째 행만 유지하고 싶습니다. 즉
"1/30/2017 11:14:55 AM",Valid customer,jim.smith,NY,1485771295
"1/26/2017 5:06:11 AM",New customer,john.doe,CA,1485403571
"1/30/2017 11:09:36 AM",New customer,tim.jones,CO,1485770976
답변1
주어진 파일 input
은
"1/30/2017 11:14:55 AM",Valid customer,jim.smith,NY,1485771295
"1/26/2017 5:06:11 AM",New customer,john.doe,CA,1485403571
"1/26/2017 8:02:01 PM",Valid customer,jim.smith,NY,1485457321
"1/30/2017 4:14:30 AM",New customer,tim.jones,CO,1485746070
"1/30/2017 11:09:36 AM",New customer,tim.jones,CO,1485770976
"1/30/2017 11:14:50 AM",Valid customer,jim.smith,NY,1485771290
"1/22/2017 11:51:51 AM",New customer,tim.jones,CO,1485082311
그 다음에
sort -t, -k3,3 -k5,5rn input | awk -F, '!seen[$3]++'
"1/30/2017 11:14:55 AM",Valid customer,jim.smith,NY,1485771295
"1/26/2017 5:06:11 AM",New customer,john.doe,CA,1485403571
"1/30/2017 11:09:36 AM",New customer,tim.jones,CO,1485770976
답변2
그리고gnu datamash
:
datamash -t, -s -f -g 3 max 5 <infile
그러나 실행하기 전에 입력의 각 줄에서 모든 후행 공백을 제거해야 합니다. 두 개의 배열
만 사용하십시오.awk
awk -F, '!z[$3]{x[$3]=$0;z[$3]=$5;next}$5>z[$3]{x[$3]=$0}
END{for (i in z){print x[i]}}' infile