Como ordenar por 2 colunas e manter a linha superior de cada grupo criada?

1

Eu tenho dois arquivos csv com o seguinte formato:

column1,column2,user,column4,column5,column...column14  

Eu gostaria de classificar os arquivos com base no usuário como primeira chave e, em seguida, com base na coluna 14, em ordem decrescente, que é um número que representa um carimbo de data / hora.

O resultado seria como:

arquivo1:

A,AA,jim,XX,YY,....,1485771395    
A,AA,jim,XX,YY,....,1485771395    

etc

Eu gostaria que esses arquivos guardassem apenas a primeira linha de cada cluster, ou seja, apenas

A,AA,jim,XX,YY,....,1485771395  

Como posso fazer isso?

Atualização:
Exemplo de entrada:

"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 última coluna é a época da primeira coluna para poder ordenar as linhas usando um número em vez de uma cadeia.
Então, o resultado esperado seria:
a) Classificando o nome e o timestamp na ordem inversa, obtemos:

"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  

Portanto, temos um cluster de linhas para jim.smith another para tim.jones classificado pela última coluna na ordem inversa (ou seja, a data mais recente da primeira linha é a primeira no cluster) e uma linha para john.doe tem apenas 1 registro.

Depois, gostaria de manter apenas a primeira linha de cada cluster. Ou seja

"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  
    
por Jim 02.02.2017 / 23:25

2 respostas

2

Dado o arquivo input as

"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  

então

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  
    
por 03.02.2017 / 19:03
1

Com gnu datamash :

datamash -t, -s -f -g 3 max 5 <infile

mas observe que você precisa remover todos os espaços em branco de cada linha na sua entrada antes de executá-la.
Com awk apenas, usando duas matrizes:

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
    
por 03.02.2017 / 19:39