10

I've such a file:

name: xxx --- time: 5.4 seconds
name: yyy --- time: 3.2 seconds
name: zzz --- time: 6.4 seconds
...

Now I want to sort this file by these float numbers to generate a new file as below:

name: yyy --- time: 3.2 seconds
name: xxx --- time: 5.4 seconds
name: zzz --- time: 6.4 seconds
...

I've tried the command awk '{print $5}' myfile | sort -g but this will show me ONLY the float numbers.

Jeff Schaller
  • 66,199
  • 35
  • 114
  • 250
Yves
  • 3,161
  • 7
  • 26
  • 54
  • is the problem including values with multiple leading digits and with maybe negative values? there further might be the chance to have exponential notation in large, small and non-needed cases. left alone the fact that a float can be even a "NaN" and its relatives. – Alexander Stohr Nov 12 '19 at 15:28

1 Answers1

16

If using GNU sort or compatible, you can use its -g switch to do a general numeric sort:

$ sort -g -k5,5 file
name: yyy --- time: 3.2 seconds
name: xxx --- time: 5.4 seconds
name: zzz --- time: 6.4 seconds

The -k5,5 tells sort to perform the sort on just the 5th column.

Usage

Keep in mind the details from the info sort page:

'-g'
'--general-numeric-sort'
'--sort=general-numeric'
     Sort numerically, converting a prefix of each line to a long
     double-precision floating point number.  *Note Floating point::.
     Do not report overflow, underflow, or conversion errors.  Use the
     following collating sequence:

        * Lines that do not start with numbers (all considered to be
          equal).
        * NaNs ("Not a Number" values, in IEEE floating point
          arithmetic) in a consistent but machine-dependent order.
        * Minus infinity.
        * Finite numbers in ascending numeric order (with -0 and +0
          equal).
        * Plus infinity.

     Use this option only if there is no alternative; it is much slower
     than '--numeric-sort' ('-n') and it can lose information when
     converting to floating point.
wjandrea
  • 658
  • 7
  • 19
slm
  • 363,520
  • 117
  • 767
  • 871
  • 7
    Note that for numbers like `3.2`, standard `sort -n` would be enough (provided the locale's radix character is that `.`). You'd need the `-g` GNU extension for numbers like 1e20, 0x20, inf... – Stéphane Chazelas Jul 30 '18 at 06:57
  • 3
    Had to use `LC_ALL=C sort -g ...` to get my sort to work. – Axel Bregnsbo Dec 03 '21 at 14:46
  • @AxelBregnsbo same here, my locale uses a comma as decimal separator, so I had to use `LC_NUMERIC=C sort` (ALL also works, of course). Thank you for pointing this out. – MayeulC Mar 15 '23 at 17:05