数値順に並べ替え

数値順に並べ替え

というファイルがありますが、dataその内容は次のとおりです。

id,col1,col2
0,-0.3479417882673812,0.5664382596767175
1,-0.26800930980980764,0.2952025161991604
2,-0.4159790791116641,-1.3375045524610152
3,-0.7859665489205871,-0.6428101880909471
4,-1.3922759043388822,-1.676262144826317
5,-1.2471867496427498,-0.4912119581361516
6,1.443385383041667,1.6974039491263593
7,-2.058899802821969,2.0607628464079917
8,-0.10641338441541626,0.035929568275064216
9,-0.517273684861199,-0.6184800988804992
10,-0.9934859021679552,1.0577312348984502
11,0.5923834706792905,-0.6693757541250825
12,0.8657741917554445,-0.6876271057571398
13,-1.2061097548360489,-0.7402582563022937
14,0.78768021182158,-0.38607117005262315

-n最初の列()を数字で並べ替えると、次のようになります。

$ sort -nk1 -t"," data
0,-0.3479417882673812,0.5664382596767175
id,col1,col2
1,-0.26800930980980764,0.2952025161991604
2,-0.4159790791116641,-1.3375045524610152
3,-0.7859665489205871,-0.6428101880909471
4,-1.3922759043388822,-1.676262144826317
5,-1.2471867496427498,-0.4912119581361516
7,-2.058899802821969,2.0607628464079917
8,-0.10641338441541626,0.035929568275064216
9,-0.517273684861199,-0.6184800988804992
10,-0.9934859021679552,1.0577312348984502
13,-1.2061097548360489,-0.7402582563022937
6,1.443385383041667,1.6974039491263593
11,0.5923834706792905,-0.6693757541250825
12,0.8657741917554445,-0.6876271057571398
14,0.78768021182158,-0.38607117005262315

これは私にとって確かに奇妙です。マニュアルページで-n数字で並べ替える必要があると読んでいます。なぜid数字の間に入れるのですか?どのようにそれはそれらのすべてよりも10大きくても小さくてもよく、同時にそれらよりも大きくすることができますか?9611

-g私が望む方法で動作するようですが(そしてそれが当然だと思います)、この-nオプションは私にはまったく適していません。これは何についてですか?ロケールと関連があると思ったが区切り記号を で指定すると,説明にならないようです。

答え1

長い話を短く

行全体を使用sort -nk1,1 -t,または並べ替えます。ここで、数字は千単位の区切り文字として解釈されるため、削除されます。-k1,

詳細

英語のロケールでは、,これは千単位の区切り文字で、sort数値の整数部分を無視します。

つまり、英語ロケールまたは,千単位の区切り文字を持つすべてのロケール(の出力を参照locale thousands_sep)でsort -nseesを使用すると、無視されたいくつかのゴミの後に続く数字は11,000,000表示されず、11代わりに11000000数字が表示されます。また11,0、しかし11110

これで(そしてこれは多くの人が持っている問題です)、-k1キー定義は最初のフィールドで始まりますが、停止位置を指定していないため、行末で終わるので、ソートキーは全体です。行(デフォルト)。

だからsort -nk1 -t,まったく同じですsort -n

千単位の区切り文字を無視して,入力すると、sort実際に次の数字がソートされます。

0
1
2
3
4
5
61.4433853830416671
7
8
9
10
110.5923834706792905
120.8657741917554445
13
140.78768021182158

6だからvs 10vsではなくvs vsです1161.443385383041667110110.5923834706792905

希望する場所は次のとおりです。

sort -nk1,1 -t,

最初の区切りフィールドのみがソートされます,-k1,1最初のフィールドの先頭から始まり、最初のフィールドの最後で終わるソートキーを定義します。

小数点または千単位の区切り記号(および小数点図)のsort -nないCロケールで使用することもできます。,.

LC_ALL=C sort -n

sort -gsort以下を使用しているので、別の方法で動作します。strtold()キーを数値として解釈し、千単位のstrtold()区切り文字を認識しません。

idヘッダー行に関する限り、数値比較では、これは数値が表示されないとid...解釈されます。 2つのレコードが等しくソートされたときに実行されるため、0次の行からソートします(ここでは数値の比較)。0-nsort最後の手段の比較これは語彙行全体の比較(および0前のソートi

いくつかのsort実装を通じて最後の手段の比較で無効にすることができます-s。これにより、行は先頭に配置されLC_ALL=C sort -snますidが、これは入力に負のキーがないためです(id(数字で0)はまだ最後にソートされます-1)。ソートから最初の行を除外するには、次のようにします。

(head -n1; LC_ALL=C sort -n) < file

関連情報