次のようなコンマ区切りファイルがあります。
100,00869184
6492,8361
1234,31
200,04071
sort
を使用してこのファイルを並べ替えたい数値最初の列のみ。
望ましい結果:
100,00869184
200,04071
1234,31
6492,8361
ソートを使用してこれを達成するにはどうすればよいですか?カンマは、そのように呼んでも、区切り文字ではなく千の区切り文字のように扱われているようです。
sort -t',' -n
とsort -t',' -nk1'
の両方が私にこれを与えます:
1234,31
200,04071
6492,8361
100,00869184
デフォルト(パラメーターなし)で並べ替えるか、sort -t','
を使用すると、次のようになります。
100,00869184
1234,31
200,04071
6492,8361
そして、数字として並べ替えるsort -n
は私にこれを与えます:
1234,31
200,04071
6492,8361
100,00869184
ソートを使用して目的の結果を達成するにはどうすればよいですか?
追加のために編集:これは、約700万行のソートされたリストを作成するための1回限りの操作であるため、回避策やその他の非正統的な方法は完全に受け入れられます。
これは確かに汚い回避策ですが、ロケールに関する@slhckのヒントのおかげで、これを行う方法を見つけました。他の人にとってより役立つより良い答えが出てきたら、これは私の特定の問題に対してのみ機能するので、私は確かにそれを受け入れます。
ロケールをスペイン語(ボリビア)に設定して、コンマが小数点のように扱われるようにした後、標準の数値ソートでうまくいきました。
$ export LC_NUMERIC="es_BO.utf8"
$ cat test.csv
100,00869184
6492,8361
1234,31
200,04071
$ sort -n test.csv
100,00869184
200,04071
1234,31
6492,8361
GNUのsort
はデフォルトでこれを行います:
$ cat test
100,00869184
6492,8361
1234,31
200,04071
$ gsort -nt',' < test
100,00869184
200,04071
1234,31
6492,8361
バージョン:
$ gsort --version
sort (GNU coreutils) 8.19
ただし、注意点があります。並べ替えが期待どおりに機能しない場合は、 locale
はおそらくC
とは異なるものに設定されています 。どうしてこれなの? locale
は、文字、数字、10進文字などの並べ替えと解釈を定義します。
これを確認するには、ターミナルにlocale
と入力するだけです。 LC_NUMERIC
に設定 en_US.UTF-8
、 多分?これは間違ったソート順を説明します。 C
に戻します。
export LC_NUMERIC=C
次に、sort
コマンドを再試行してください。グローバルlocale
をC
に設定する場合は、次のようにします。
export LC_ALL=C
数値の並べ替えを実行することを想定した-g
オプションを追加してみてください。
試してください:
sort -t',' -g <whatever>
区切り文字を置き換えます。
cat commafile | tr , " " | sort -n
-あなたを助けるはずです。