根据Bash中字段的数值排序

时间:2011-01-31 20:59:38

标签: linux sorting command

示例: File.txt的内容:

  100 foo
  2 bar
  300 tuu

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

  2 bar
  100 foo
  300 tuu

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

8 个答案:

答案 0 :(得分:136)

查看man page for sort ...

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

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

sort -n filename

答案 1 :(得分:84)

如果要排序混合文本和字符串的字符串数字,例如滚动日志的文件名然后使用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

来自手册页:

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

答案 2 :(得分:18)

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

sort -n

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

输入文件:

-0.907928466796875
-0.61614990234375
1.135406494140625
0.48614501953125
-0.4140167236328125

输出:

-0.4140167236328125
0.48614501953125
-0.61614990234375
-0.907928466796875
1.135406494140625

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

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

P.S。:使用sort -g返回与此示例相同的结果

编辑:

看起来区域设置会影响减号影响订单的方式(see here)。为了得到适当的结果,我刚刚做了:

LC_ALL=C sort -n filename.txt

答案 3 :(得分:6)

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

sort -n -k 1,1 File.txt

答案 4 :(得分:3)

使用sort -nsort --numeric-sort

答案 5 :(得分:1)

您必须执行以下命令:

sort -n -k1 filename

应该这样做:)

答案 6 :(得分:-1)

Use sort -nr for sorting in descending order. Refer

Sort

Refer the above Man page for further reference

答案 7 :(得分:-4)

    echo " Enter any values to sorting: "
read n
i=0;
t=0;
echo " Enter the n value: "
for(( i=0;i<n;i++ ))
do
read s[$i]
done
for(( i=0;i<n;i++ ))
do
for(( j=i+1;j<n;j++ ))
do
if [ ${s[$i]} -gt ${s[$j]} ]
then
t=${s[$i]}
s[$i]=${s[$j]}
s[$j]=$t
fi
done
done
for(( i=0;i<n;i++ ))
do
echo " ${s[$i]}  "
done