如何按多列对 CSV 行进行分组

如何按多列对 CSV 行进行分组

我正在处理包含以下格式的文件:

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    

我试图通过这三列的最相似(最大公约数)对线进行分组。
这意味着如果两条或多条线路共享相同的 CF-PN-UC 值,则应将它们分组,如果不是这样,则共享相同 CF-PN 的线路应分组,但如果不是,则其余的必须按 CF 分组。

有没有办法让我得到以下结果?

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 

感谢您的帮助。

答案1

这只是一个排序问题:

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

这意味着:“按第 2 列数字排序。如果平局,则按第 3 列排序。如果平局,则按第 5 列排序。

相关内容