複数の列で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    

私はこれら3つの列の中で最も類似した(最大共通分母)基準で線をグループ化したいと思います。
つまり、2 つ以上の回線が同じ 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に基づいてソートします」を意味します。

おすすめ記事