Unix マルチ列ソートの問題

Unix マルチ列ソートの問題

ファイルを並べ替えようとしています。

TX001;A0004|Number|5|0|Y|1        
TX001;A0110|VARCHAR|5|0|Y|4         
TX001;A1332|VARCHAR|15|0|Y|3         
TX001;B3321|VARCHAR|15|0|Y|5         
TX001;C1321|VARCHAR|15|0|Y|2      
TY001;A1234|Number|5|0|Y|3        
TY001;C2335|VARCHAR|5|0|Y|1        
TY001;B2133|VARCHAR|15|0|Y|2        
TZ001;A1234|Number|5|0|Y|3    
TZ001;A2133|VARCHAR|5|0|Y|1  
TZ001;C0133|VARCHAR|15|0|Y|2

予想される出力は次のとおりです。

TX001;A0004|Number|5|0|Y|1   
TX001;C1321|VARCHAR|15|0|Y|2   
TX001;A1332|VARCHAR|15|0|Y|3  
TX001;A0110|VARCHAR|5|0|Y|4  
TX001;B3321|VARCHAR|15|0|Y|5  
TY001;C2335|VARCHAR|5|0|Y|1  
TY001;B2133|VARCHAR|15|0|Y|2  
TY001;A1234|Number|5|0|Y|3  
TZ001;A2133|VARCHAR|5|0|Y|1      
TZ001;C0133|VARCHAR|15|0|Y|2  
TZ001;A1234|Number|5|0|Y|3

最後の数値列に基づいてソートする必要があります。 sort を使用しようとすると、-n最初の列の順序が変更されます。

を試しましたが、sort -t "|" -k 6,6n FNAM.txt数値のソートのため、最初の列の順序が変更されました。

テーブル名の最初の列は、影響を受けずに最後の列に基づいて数値順にソートする必要があります。

答え1

何でもPOSIX互換 sort:

sort -t"|" -k1,1.6 -k6n file
  • -t"|"区切り記号をに設定します|
  • -k1,1.6最初のフィールドを最初から6番目の文字まで並べ替えます。1
  • -k6n次に、6番目のフィールドを数値順に並べ替えます。

1マンページから:

POS is F[.C][OPTS], where F is the field number and C the character position in the field;

答え2

sortさまざまな種類の列を並べ替えることは可能ですが、区切り文字は単一文字でなければなりません。例を処理し、予想される出力を生成するには、最初の ';' を '|' に置き換えて、最初の列を数値順に並べ替えてから(前の 6 番目の列)、最後に最初の '|' ';':

sed 's/;/|/' < FNAM.txt | sort -t\| -k1,1 -k7,7n | sed 's/|/;/'

試したバリエーション、

sort -t "|" -k 6,6n FNAM.txt

ファイル全体を 6 番目の列でのみ数値でソートします。sortユーザーが未知の構造を知らないため、最初の数文字で行をグループ化する必要があることに気づいていません。したがって、最後の列が完全にソートされ、結果としてテーブル名が混在します。

関連情報