2012-04-25 13 views
4

指数付きの浮動小数点数を持つファイルがあり、ソートする必要があります。 AFAIK 'sort -g'は私が必要なものです。しかし、それはすべての指数を捨てて浮動小数点を並べ替えるように思えます。だから、出力は(私が欲しかったものではありません)次のようになります。'sort -g' bashコマンドで指数で浮動小数点数をソートする

  1. 私はそれを期待どおりに動作しないのはなぜ「ソート-g」:

    $ cat file.txt | sort -g 
    8.387280091e-05 
    8.391373668e-05 
    8.461754562e-07 
    8.547354437e-05 
    8.831553093e-06 
    8.936111118e-05 
    8.959458896e-07 
    

    これは二つの質問に私をもたらします作業?

  2. bashコマンドを使用してファイルを並べ替える方法を教えてください。
+0

あなたの 'sort'のバージョンは何ですか? – kev

+1

それは私のために働く(GNUソート)。 [this](http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html)を読んで、脚注に特に注意してください。 – potong

+0

potong:ありがとう、その問題を解決しました。私が持っていたロケール(ru_RU.UTF-8)のように、小数点記号としてドットを扱わないようです。 – Alex

答えて

2

あなたの方法は、上記のコードは動作しない場合

cat file.txt | sort -g 

絶対に正しい、この

sed 's/\./0000000000000/g' file.txt | sort -g | sed 's/0000000000000/\./g' 

変換を試してみてください '' '0000000000000'には、ソートして再び '。'で置換します。私は数字と入力の不一致を避けるために置き換えるために '0000000000000'を選択しました。 番号は自分で操作できます。

+0

私の質問へのコメントですでにpotongは私の問題を解決しました。私が持っていたロケール(ru_RU.UTF-8)はドットを小数点の区切り文字として扱いません。解決策は、LC_ALL環境変数を 'C'に設定することです。 – Alex

4

いくつかの国では、システムレベルで.の代わりに,を小数点の区切り記号として使用することで、ローカル設定でこれを混乱させる可能性があるという問題があります。端末にlocaleと入力して確認します。値が何かあるならば、それのロケールファイル

sudo gedit /etc/default/locale 

を編集することで、上記のように変更し、

LC_NUMERIC=en_US.UTF-8 

エントリがあるはずです。また、一時的に端末内に書き込むように短いですが、それは、このような多分時刻の形式など、いくつかの他のシステム全体の動作を変更する可能性があるので、ロケールファイルにそれを置くことは好ましいことではないかもしれません

LC_ALL=C sort -g file.dat 

LC_ALL=Cをすることによって、この値を使用することができます。

+0

@テム私はこの古い投稿を編集したので、もっと適切でなければなりません:)最初の記事を書いたときにコメントする許可はありませんでした。 –

+0

あなたはこの回答に同意する必要があります。 – Omnifarious

+0

はい、最高のもの – 42n4

5

がここに巧妙なトリックです:

$ sort -te -k2,2n -k1,1n test.txt 
8.461754562e-07 
8.959458896e-07 
8.831553093e-06 
8.387280091e-05 
8.391373668e-05 
8.547354437e-05 
8.936111118e-05 

-teは、仮数と指数を分離eによって2つのフィールドにあなたの番号を分割します。 -k2,2は指数で最初にソートすると言い、次に-k1,1はあなたの仮数で次にソートすると言います。

sortコマンドのすべてのバージョンで動作します。

関連する問題