如何根据字段的数值对文件排序?


114

范例file.txt

  100 foo
  2 bar
  300 tuu

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

  2 bar
  100 foo
  300 tuu

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

Answers:


149

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

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

所以这是一个例子...

sort -n filename

1
谢谢大家!这是有线的,因为我来回浏览了其手册页几次,但没有看到该选项。啊,我在简化的手册页上。该死的!
lukmac

1
请注意,对于浮点数,-g, --general-numeric-sort建议使用。这进一步允许科学计数法如1.234E10等
疱疹自由工程师

103

如果您要对混合文本和数字的字符串进行排序,例如滚动日志的文件名,则排序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

1
这让我绊倒了,谢谢!至少在我的cygwin上,使我感到困惑的另一件事是,即使ls通过传递sed替换来删除字母并仅保留数字,显然彩色输出也会影响事物。因此,跑步ls --color=never也有所不同。
Max Starkenburg

太棒了,-V这正是我想要的。我应该养成先浏览手册页的习惯。
srowley

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但前提是所有值均为正。

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

编辑:

看起来语言环境设置会影响减号如何影响顺序(请参见此处)。为了获得正确的结果,我只是这样做了:

LC_ALL=C sort -n filename.txt



1

您必须执行以下命令:

sort -n -k1 filename

那应该做的:)



-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

1
希望添加一些有关此代码作用的文字说明?
Stedy's
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.