【发布时间】:2011-06-18 20:49:21
【问题描述】:
例如file.txt:
100 foo
2 bar
300 tuu
当使用sort -k 1,1 file.txt时,行的顺序不会改变,尽管我们期待:
2 bar
100 foo
300 tuu
如何根据绝对数值对由数字组成的字段进行排序?
【问题讨论】:
标签: linux bash sorting command
例如file.txt:
100 foo
2 bar
300 tuu
当使用sort -k 1,1 file.txt时,行的顺序不会改变,尽管我们期待:
2 bar
100 foo
300 tuu
如何根据绝对数值对由数字组成的字段进行排序?
【问题讨论】:
标签: linux bash sorting command
看看man page for sort...
-n, --numeric-sort compare according to string numerical value
所以这里是一个例子......
sort -n filename
【讨论】:
-g, --general-numeric-sort 可能更可取。这进一步允许科学记数法,例如1.234E10等
如果您正在对混合文本和数字的字符串进行排序,例如滚动日志的文件名,则使用 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
【讨论】:
ls 通过sed 替换以删除字母并只留下数字,显然彩色输出也会影响事物。所以运行ls --color=never 也有所作为。
-V 正是我想要的。我应该养成先浏览手册页的习惯。
-V 是我需要的版本!
嗯,这里的大多数其他答案都是指
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
【讨论】:
您必须使用数字排序选项:
sort -n -k 1,1 File.txt
【讨论】:
使用sort -n 或sort --numeric-sort。
【讨论】:
您必须执行以下命令:
sort -n -k1 filename
应该这样做:)
【讨论】:
【讨论】:
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
【讨论】: