web-dev-qa-db-ja.com

gnu sortの--general-numeric-sortオプションと--numeric-sortオプションの違いは何ですか

sortは、2種類の数値ソートを提供します。これはmanページからです:

   -g, --general-numeric-sort
          compare according to general numerical value

   -n, --numeric-sort
          compare according to string numerical value

違いは何ですか?

106
Trenton

一般的な数値並べ替えでは、数値を浮動小数点数として比較します。これにより、1.234E10などの科学表記が可能になりますが、丸め誤差が生じます(1.2345678は1.2345679の後に来る可能性があります)。

http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html を参照してください

「-g」「-general-numeric-sort」「-sort = general-numeric」標準のC関数strtodを使用して各行のプレフィックスを倍精度浮動小数点数に変換し、数値でソートします。これにより、1.0e-34や10e100などの浮動小数点数を科学表記法で指定できます。 LC_NUMERICロケールは、小数点文字を決定します。オーバーフロー、アンダーフロー、または変換エラーを報告しないでください。次の照合シーケンスを使用します。数字で始まらない行(すべて等しいと見なされます)。一貫性はあるがマシンに依存した順序のNaN(IEEE浮動小数点演算の「数値ではない」値)。マイナス無限大。昇順の有限数(-0と+0は等しい)。プラス無限大。

このオプションは、代替手段がない場合にのみ使用してください。 --numeric-sort(-n)よりはるかに遅く、浮動小数点に変換するときに情報を失う可能性があります。

「-n」「-numeric-sort」「-sort = numeric」数値順にソートします。番号は各行で始まり、オプションの空白、オプションの「-」記号、千桁の区切り文字で区切られたゼロ以上の数字で構成され、オプションで小数点文字とゼロ以上の数字が続きます。空の番号は「0」として扱われます。 LC_NUMERICロケールは、小数点文字と桁区切り記号を指定します。デフォルトでは、空白はスペースまたはタブですが、LC_CTYPEロケールはこれを変更できます。

比較は正確です。丸め誤差はありません。

先頭の「+」も指数表記も認識されません。このような文字列を数値で比較するには、-general-numeric-sort(-g)オプションを使用します。

81
Martin Beckett

ロケールに注意する必要があります。たとえば、浮動小数点数(2.2など)を並べ替える一方で、ロケールではコンマ(2,2など)の使用が想定される場合があります。

このフォーラム で報告されているように、-nまたは-gフラグを使用すると間違った結果になる可能性があります。

私の場合、私は以下を使用します:

LC_ALL=C sort -k 6,6n file

次を含む6番目の列をソートするには:

2.5
3.7
1.4

を手に入れるために

1.4
2.5
3.7
10
JFL