Como agrupar linhas CSV por várias colunas

0

Estou trabalhando em um arquivo que contém o seguinte formato:

R      |  CF    |  PN    |  seq          |  UC  

801    |  10    |  P3    |  643455423    |  C1    
804    |  11    |  P1    |  643455427    |  C1    
804    |  11    |  P1    |  643455427    |  C5    
802    |  11    |  P2    |  643455431    |  C1    
800    |  11    |  P2    |  643455429    |  C2    
800    |  11    |  P2    |  643455429    |  C2    
802    |  11    |  P2    |  643455431    |  C2    
800    |  11    |  P3    |  643455423    |  C1    
804    |  11    |  P3    |  643455433    |  C2    
802    |  11    |  P3    |  643455425    |  C3    
804    |  11    |  P3    |  643455433    |  C3    
802    |  11    |  P4    |  643455425    |  C2    
801    |  12    |  P1    |  643455424    |  C2    
801    |  12    |  P1    |  643455424    |  C2    
805    |  12    |  P1    |  643455434    |  C2    
805    |  12    |  P1    |  643455434    |  C3    
805    |  12    |  P3    |  643455428    |  C1    
805    |  12    |  P3    |  643455428    |  C1    
801    |  12    |  P3    |  643455430    |  C3    
803    |  14    |  P1    |  643455432    |  C1    
803    |  14    |  P1    |  643455432    |  C1    
803    |  14    |  P2    |  643455426    |  C1    
803    |  14    |  P2    |  643455426    |  C3    
801    |  19    |  P4    |  643455430    |  C3    

Estou tentando agrupar as linhas pelo mais ressemblece (máximo-comum-Divisor como) por essas três colunas.
Isso significa que se duas linhas ou mais compartilham os mesmos valores CF-PN-UC, eles devem ser agrupados, se não, aqueles que compartilham o mesmo CF-PN devem ser agrupados, mas se não, o restante deve ser agrupado pelo CF .

Existe uma maneira de obter o seguinte como resultado?

R      |  CF    |  PN    |  seq          |  UC  
#CF
801    |  10    |  P3    |  643455423    |  C1  
#CF-PN
804    |  11    |  P1    |  643455427    |  C1    
804    |  11    |  P1    |  643455427    |  C5       
#CF-PN-UC
800    |  11    |  P2    |  643455429    |  C2    
800    |  11    |  P2    |  643455429    |  C2    
802    |  11    |  P2    |  643455431    |  C2    
#CF-PN
800    |  11    |  P3    |  643455423    |  C1    
804    |  11    |  P3    |  643455433    |  C2    
#CF-PN-UC
802    |  11    |  P3    |  643455425    |  C3    
804    |  11    |  P3    |  643455433    |  C3  
#CF
802    |  11    |  P2    |  643455431    |  C1  
802    |  11    |  P4    |  643455425    |  C2    
#CF-PN-UC
801    |  12    |  P1    |  643455424    |  C2    
801    |  12    |  P1    |  643455424    |  C2    
805    |  12    |  P1    |  643455434    |  C2    
#CF-PN-UC
805    |  12    |  P3    |  643455428    |  C1    
805    |  12    |  P3    |  643455428    |  C1  
#CF
805    |  12    |  P1    |  643455434    |  C3 
801    |  12    |  P3    |  643455430    |  C3    
#CF-PN-UC
803    |  14    |  P1    |  643455432    |  C1    
803    |  14    |  P1    |  643455432    |  C1    
#CF-PN
803    |  14    |  P2    |  643455426    |  C1    
803    |  14    |  P2    |  643455426    |  C3    
#CF
801    |  19    |  P4    |  643455430    |  C3 

Obrigado pela sua ajuda.

    
por inaliahgle 19.06.2017 / 17:38

1 resposta

2

Este é apenas um problema de classificação:

head -2 input.file; tail -n +3 input.file | sort -t '|' -k2,2n -k3,3 -k5,5

Isso significa: "Classifique pela coluna 2 numericamente. No caso de empate, classifique por coluna 3. No caso de empate, classifique por coluna 5.

    
por 19.06.2017 / 20:49

Tags