根据Bash中字段的数值排序

luk*_*mac 103 linux sorting command

示例: File.txt的内容:

  100 foo
  2 bar
  300 tuu
Run Code Online (Sandbox Code Playgroud)

当使用'sort -k 1,1 File.txt'时,行的顺序不会改变,尽管我们期望:

  2 bar
  100 foo
  300 tuu
Run Code Online (Sandbox Code Playgroud)

我们如何根据绝对数值对包含数字的字段进行排序?

And*_*ite 142

看一下手册页进行排序 ......

   -n, --numeric-sort
          compare according to string numerical value
Run Code Online (Sandbox Code Playgroud)

所以这是一个例子......

sort -n filename
Run Code Online (Sandbox Code Playgroud)

  • 请注意,对于浮点数,建议使用“-g, --general-numeric-sort”。这进一步允许使用科学计数法,例如 1.234E10 等。 (2认同)

TMG*_*TMG 91

如果要对混合文本和数字的字符串进行排序,例如滚动日志的文件名,则排序使用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
Run Code Online (Sandbox Code Playgroud)

在那种情况下,选项-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
Run Code Online (Sandbox Code Playgroud)

来自手册页:

   -V, --version-sort
          natural sort of (version) numbers within text
Run Code Online (Sandbox Code Playgroud)


pgi*_*mon 18

那么,这里的大多数其他答案都是指

sort -n
Run Code Online (Sandbox Code Playgroud)

但是,我不确定这是否适用于负数.以下是我在Fedora 9上使用排序版本6.10获得的结果.

输入文件:

-0.907928466796875
-0.61614990234375
1.135406494140625
0.48614501953125
-0.4140167236328125
Run Code Online (Sandbox Code Playgroud)

输出:

-0.4140167236328125
0.48614501953125
-0.61614990234375
-0.907928466796875
1.135406494140625
Run Code Online (Sandbox Code Playgroud)

这显然不是按数值排序的.

然后,我想更精确的答案就是使用,sort -n但前提是所有值都是正值.

PS:sort -g对于此示例,使用返回相同的结果

编辑:

看起来区域设置会影响减号如何影响订单(请参阅此处).为了得到适当的结果,我刚刚做了:

LC_ALL=C sort -n filename.txt
Run Code Online (Sandbox Code Playgroud)


Kai*_*nad 6

您必须使用数字排序选项:

sort -n -k 1,1 File.txt
Run Code Online (Sandbox Code Playgroud)