ファイルをソートしたいです。
入力する:
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
入力ファイルが逆順にソートされます。infile
2番目のフィールド(カンマは区切り文字)はk
eyフィールドとして機能します。これアッコードは、単に同じ最初の列にレコードを並べ替えることによって、各グループを区別します。無効特徴
\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