web-dev-qa-db-ja.com

Unixでコンマ区切りファイルを数値で並べ替える

次のようなコンマ区切りファイルがあります。

100,00869184
6492,8361
1234,31
200,04071

sortを使用してこのファイルを並べ替えたい数値最初の列のみ

望ましい結果:

100,00869184
200,04071
1234,31
6492,8361

ソートを使用してこれを達成するにはどうすればよいですか?カンマは、そのように呼んでも、区切り文字ではなく千の区切り文字のように扱われているようです。

sort -t',' -nsort -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回限りの操作であるため、回避策やその他の非正統的な方法は完全に受け入れられます。

8
dpatchery

これは確かに汚い回避策ですが、ロケールに関する@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
9
dpatchery

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コマンドを再試行してください。グローバルlocaleCに設定する場合は、次のようにします。

export LC_ALL=C
6
slhck

数値の並べ替えを実行することを想定した-gオプションを追加してみてください。

試してください:

sort -t',' -g <whatever>
1
HeatfanJohn

区切り文字を置き換えます。

cat commafile | tr , " " | sort -n 

-あなたを助けるはずです。

0
defhlt