# How to sort lines by float number

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.

• 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. Commented Nov 12, 2019 at 15:28

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.
``````
• 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... Commented Jul 30, 2018 at 6:57
• Had to use `LC_ALL=C sort -g ...` to get my sort to work. Commented Dec 3, 2021 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. Commented Mar 15, 2023 at 17:05
• Apparently this option is incompatible with `-u` (to remove duplicate lines): with `-g`, when determining whether two lines are “identical”, only the floating-point number is taken into account! Commented Nov 4, 2023 at 20:32