Sorting according to field's numerical value i

2019-01-13 08:55发布

Example: content of File.txt:

  100 foo
  2 bar
  300 tuu

When using 'sort -k 1,1 File.txt', the order of lines will not changed, though we are expecting :

  2 bar
  100 foo
  300 tuu

How can we sort a field consisting numbers based on the absolute numerical value?

8条回答
Summer. ? 凉城
2楼-- · 2019-01-13 09:31

You must do the following command:

sort -n -k1 filename

That should do it :)

查看更多
混吃等死
3楼-- · 2019-01-13 09:32

Take a peek at the man page for sort...

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

So here is an example...

sort -n filename
查看更多
Animai°情兽
4楼-- · 2019-01-13 09:39

Well, most other answers here refer to

sort -n

However, I'm not sure this works for negative numbers. Here are the results I get with sort version 6.10 on Fedora 9.

Input file:

-0.907928466796875
-0.61614990234375
1.135406494140625
0.48614501953125
-0.4140167236328125

Output:

-0.4140167236328125
0.48614501953125
-0.61614990234375
-0.907928466796875
1.135406494140625

Which is obviously not ordered by numeric value.

Then, I guess that a more precise answer would be to use sort -n but only if all the values are positive.

P.S.: Using sort -g returns just the same results for this example

Edit:

Looks like the locale settings affect how the minus sign affects the order (see here). In order to get proper results I just did:

LC_ALL=C sort -n filename.txt
查看更多
Animai°情兽
5楼-- · 2019-01-13 09:43

You have to use the numeric sort option:

sort -n -k 1,1 File.txt
查看更多
forever°为你锁心
6楼-- · 2019-01-13 09:45

If you are sorting strings that are mixed text & numbers, for example filenames of rolling logs then sorting with sort -n doesn't work as expected:

$ 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

In that case option -V does the trick:

$ 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

from man page:

   -V, --version-sort
          natural sort of (version) numbers within text
查看更多
爷的心禁止访问
7楼-- · 2019-01-13 09:48

Use sort -n or sort --numeric-sort.

查看更多
登录 后发表回答