2番目のフィールドに基づいて並べ替え、同じ最初の列を使用して行を並べ替えますが、グループごとに2番目のフィールドの順序は維持されます。

2番目のフィールドに基づいて並べ替え、同じ最初の列を使用して行を並べ替えますが、グループごとに2番目のフィールドの順序は維持されます。

ファイルをソートしたいです。

入力する:

I1, -2   
I2, -6  
I2, -9  
I1, -8  
I1, -1  
I3, -7  
I2, -4  
I3, -4  

出力:

I2, -9  
I2, -6  
I2, -4  
I1, -8  
I1, -2  
I1, -1  
I3, -7  
I3, -4

以下の出力をどのように取得できますか?

ベストアンサー1

汚れた解決策は次のとおりです。

<infile sort -t, -rk2,2 \
|awk -F, '{ seen[$1]= (seen[$1]==""? "\0":seen[$1] ORS) $0 }
 END{ for (x in seen) print seen[x] }' \
|sort -z -t, -rk2,2 \
|tr -d '\0'

分解:

  • <infile sort -t, -rk2,2
    これにより、r入力ファイルが逆順にソートされます。infile2番目のフィールド(カンマは区切り文字)はkeyフィールドとして機能します。

  • これアッコードは、単に同じ最初の列にレコードを並べ替えることによって、各グループを区別します。無効特徴\0

  • sort -z -t, -rk2,2
    -zこの逆方向ソートは、2番目のフィールドとカンマで区切られたフィールド(ヌル文字で区切られ、Tell-sortコマンドを使用)でこれらのブロックをソートします。この手順を実行する前に、次の出力を確認して表示さcat -Aれる内容を追加してください。

    ^@I1, -8$
    I1, -2$
    I1, -1$
    ^@I2, -9$
    I2, -6$
    I2, -4$
    ^@I3, -7$
    I3, -4$
    

    ^@文字はヌル文字を表します。sort -z上記の入力は次のとおりです(人の読みやすさと理解を助けるためにこれを行いました)。

    ^@I1, -8$      I1, -2$      I1, -1$
    ^@I2, -9$      I2, -6$      I2, -4$
    ^@I3, -7$      I3, -4$
    

    あなたはアイデアを得ました。上記のソートコマンドは、2番目のフィールドを次のように表示します。

     -8$      I1
     -9$      I2
     -7$      I3
    

    ...これを逆順に並べ替えると、結果は次のように変更されます。

    ^@I2, -9$      I2, -6$      I2, -4$
    ^@I1, -8$      I1, -2$      I1, -1$
    ^@I3, -7$      I3, -4$
    

    ...構造体を返すと、実際には次のような結果が表示されます。

    ^@I2, -9$
    I2, -6$
    I2, -4$
    ^@I1, -8$
    I1, -2$
    I1, -1$
    ^@I3, -7$
    I3, -4$
    
  • tr -d '\0'
    結果から追加されたヌル文字が削除され、最終出力は次のようになります。

    I2, -9
    I2, -6
    I2, -4
    I1, -8
    I1, -2
    I1, -1
    I3, -7
    I3, -4
    

おすすめ記事