web-dev-qa-db-ja.com

Bashのフィールドの数値に従ってソートする

例: File.txtのコンテンツ:

  100 foo
  2 bar
  300 tuu

「sort -k 1,1 File.txt」を使用すると、行の順序は変更されませんが、次のようになります。

  2 bar
  100 foo
  300 tuu

絶対数値値に基づいて数値で構成されるフィールドをソートするにはどうすればよいですか?

102
lukmac

sortのmanページ ...を覗いてください.

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

ここに例があります...

sort -n filename
140
Andrew White

ローリングログのファイル名など、テキストと数字が混在する文字列を並べ替えている場合、sort -nを使用した並べ替えは期待どおりに機能しません。

$ ls |sort -n
output.log.1
output.log.10
output.log.11
output.log.12
output.log.13
output.log.14
output.log.15
output.log.16
output.log.17
output.log.18
output.log.19
output.log.2
output.log.20
output.log.3
output.log.4
output.log.5
output.log.6
output.log.7
output.log.8
output.log.9

その場合、オプション-Vはトリックを実行します。

$ ls |sort -V
output.log.1
output.log.2
output.log.3
output.log.4
output.log.5
output.log.6
output.log.7
output.log.8
output.log.9
output.log.10
output.log.11
output.log.12
output.log.13
output.log.14
output.log.15
output.log.16
output.log.17
output.log.18
output.log.19
output.log.20

manページから:

   -V, --version-sort
          natural sort of (version) numbers within text
89
TMG

さて、ここでの他のほとんどの答えは

sort -n

ただし、これが負の数で機能するかどうかはわかりません。 Fedora 9のsortバージョン6.10で得られた結果を以下に示します。

入力ファイル:

-0.907928466796875
-0.61614990234375
1.135406494140625
0.48614501953125
-0.4140167236328125

出力:

-0.4140167236328125
0.48614501953125
-0.61614990234375
-0.907928466796875
1.135406494140625

これは明らかに数値で順序付けされていません。

次に、すべての値が正の場合にのみ、sort -nを使用することがより正確な答えになると思います。

追伸:sort -gを使用すると、この例では同じ結果が返されます

編集:

ロケール設定はマイナス記号が順序にどのように影響するかに影響するようです( こちらを参照 )。適切な結果を得るために、私はちょうどやった:

LC_ALL=C sort -n filename.txt
18
pgilmon

数値の並べ替えオプションを使用する必要があります。

sort -n -k 1,1 File.txt
6
Kai Sternad

sort -nまたはsort --numeric-sortを使用します。

3
Roman Cheplyaka

次のコマンドを実行する必要があります。

sort -n -k1 filename

それはそれを行う必要があります:)

1
amc