というファイルがありますが、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
大きくても小さくてもよく、同時にそれらよりも大きくすることができますか?9
6
11
-g
私が望む方法で動作するようですが(そしてそれが当然だと思います)、この-n
オプションは私にはまったく適していません。これは何についてですか?ロケールと関連があると思ったが区切り記号を で指定すると,
説明にならないようです。
答え1
長い話を短く
行全体を使用sort -nk1,1 -t,
または並べ替えます。ここで、数字は千単位の区切り文字として解釈されるため、削除されます。-k1
,
詳細
英語のロケールでは、,
これは千単位の区切り文字で、sort
数値の整数部分を無視します。
つまり、英語ロケールまたは,
千単位の区切り文字を持つすべてのロケール(の出力を参照locale thousands_sep
)でsort -n
seesを使用すると、無視されたいくつかのゴミの後に続く数字は11,000,000
表示されず、11
代わりに11000000
数字が表示されます。また11,0
、しかし11
。110
これで(そしてこれは多くの人が持っている問題です)、-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 10
vsではなくvs vsです11
。61.4433853830416671
10
110.5923834706792905
希望する場所は次のとおりです。
sort -nk1,1 -t,
最初の区切りフィールドのみがソートされます,
。-k1,1
最初のフィールドの先頭から始まり、最初のフィールドの最後で終わるソートキーを定義します。
小数点または千単位の区切り記号(および小数点図)のsort -n
ないCロケールで使用することもできます。,
.
LC_ALL=C sort -n
sort -g
sort
以下を使用しているので、別の方法で動作します。strtold()
キーを数値として解釈し、千単位のstrtold()
区切り文字を認識しません。
id
ヘッダー行に関する限り、数値比較では、これは数値が表示されないとid...
解釈されます。 2つのレコードが等しくソートされたときに実行されるため、0
次の行からソートします(ここでは数値の比較)。0
-n
sort
最後の手段の比較これは語彙行全体の比較(および0
前のソートi
)
いくつかのsort
実装を通じて最後の手段の比較で無効にすることができます-s
。これにより、行は先頭に配置されLC_ALL=C sort -sn
ますid
が、これは入力に負のキーがないためです(id
(数字で0)はまだ最後にソートされます-1
)。ソートから最初の行を除外するには、次のようにします。
(head -n1; LC_ALL=C sort -n) < file