Unixでカンマ区切りのファイルを数値でソートする


8

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

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回の操作のため、回避策またはその他の非正統的な方法は完全に許容されます。


私が見るの例ここでは示しているように見える-tとの間のスペース持つものとしてオプションを-t文字
SeanC

最初に考えた-カットを使用します。与えられたセパレータに基づいて、特定の列のみを選択します。また、「アルテム・アイス」の答えはtrです。私はtrが大好きです。しかし、私はこれを書いてテストするのが面倒です。乾杯!
Vorac

回答:


9

これは確かに汚い回避策ですが、@ 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

ええと、ドイツ語のロケールなどを使用することをお勧めします。これは非常にまれなUnixバージョンであるため、それをテストしたり、使用可能なツールを入手したりしなければ、今のところ他のことを考えることはできません。
slhck 2012

@slhckこれは、私がUNIXで立ち往生しているほとんどの問題の核心と思われます:)とにかく、私を解決策に導いてくれてありがとう。
dpatchery 2012

6

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文字、数字、小数点文字などのソートと解釈を定義します。

これを確認するにlocaleは、ターミナルに入力します。さLC_NUMERICに設定しen_US.UTF-8、多分、?これは間違ったソート順を説明します。に戻しますC

export LC_NUMERIC=C

その後、sortコマンドを再試行してください。グローバルlocaleをに設定する場合はC、次のようにします。

export LC_ALL=C

私の環境ではGNUにアクセスできません。簡単に手に入れられて、終了時に削除できますか?誰かがこれを手伝ってくれたらチャットでHMUをします...私はUNIX初心者です。
dpatchery 2012

それは単なるlocale問題だと確信しています。でもsort --version、実際はどうですか?
slhck 2012

sort --versionは私に違法な引数を与えます。--コマンドも以前は機能しませんでした。マニュアルページを確認したところ、明示的に呼び出されたバージョンはありませんが、「HP-UX 11iバージョン2:2003年8月」と表示された場合は、それでも問題が解決します。LC_NUMERICが「C」に設定されています。
dpatchery 2012

たとえば、ドイツ語のロケールでは,、小数点として使用されます。私はHP-UXを使用したことがありません。
slhck 2012

1

-g数値ソートを実行することを想定しているオプションを追加してみてください。

試してください:

sort -t',' -g <whatever>

-n数値ソートではありませんか?-gを指定すると、違法なオプションが表示されます。
dpatchery 2012

-ggeneral-numeric-sortオプションであり、実際にはのすべての最新バージョンで使用できますsort。@dpatchery
slhck

私は、ほぼ間違いなく最新のバージョンを持っていないので、これは仕事の私の場所にある:)
dpatchery

0

デリミタを交換します。

cat commafile | tr , " " | sort -n 

-あなたを助けるべきです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.