Awk

如何按多列對 CSV 行進行分組

  • June 19, 2017

我正在處理一個包含以下格式的文件:

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 

謝謝你的幫助。

這只是一個排序問題:

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

這意味著:“按數字按第 2 列排序。在平局的情況下,按第 3 列排序。在平局的情況下,按第 5 列排序。

引用自:https://unix.stackexchange.com/questions/372012