2개의 열을 기준으로 정렬하고 생성된 각 그룹의 맨 위 행을 유지하려면 어떻게 해야 합니까?

2개의 열을 기준으로 정렬하고 생성된 각 그룹의 맨 위 행을 유지하려면 어떻게 해야 합니까?

다음 형식의 두 개의 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

관련 정보