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

问题描述 投票:0回答:9

示例

file.txt

  100 foo
  2 bar
  300 tuu

使用

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

  2 bar
  100 foo
  300 tuu

如何根据绝对数值对由数字组成的字段进行排序?

linux bash sorting command
9个回答
166
投票

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

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

这是一个例子...

sort -n filename

140
投票

如果您要对混合文本和数字的字符串进行排序,例如滚动日志的文件名,则使用

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

19
投票

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

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
会返回与此示例相同的结果

编辑:

看起来区域设置会影响减号如何影响顺序(参见此处)。为了获得正确的结果,我刚刚做了:

LC_ALL=C sort -n filename.txt

8
投票

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

sort -n -k 1,1 File.txt

3
投票

使用

sort -n
sort --numeric-sort


1
投票

您必须执行以下命令:

sort -n -k1 filename

应该可以了:)


0
投票

谢谢你,pgilmon。

我试图制作一个 m3u 播放列表,对所有目录和子目录进行精确的字母排序,其中一些具有相同的名称和编号。 字母不是问题,编号才是问题。

之前: 专辑 专辑2

变成了 专辑2 专辑

您的

LC_ALL=C sort -n
以更简单且正确的方式完成了这一任务。我读了“排序”帮助/手册中的 LC_ALL=C 但没有太注意它(或者更确切地说不明白如何准确使用它)。

结束码:

find . -depth -type f -iregex "\(.*mp3\|.*m4a\)" | LC_ALL=C sort -n > myplaylist_ordered.m3u

将(给定的)音乐文件路径按树形顺序写入 m3u。

替代方案是完全打乱的列表:

find . -depth -type f -iregex "\(.*mp3\|.*m4a\)" | shuf > myplaylist_shuffled.m3u

至少在这种情况下,这些东西目前对我来说似乎很有效。


-1
投票

使用 sort -nr 按降序排序。参考

排序

请参阅上面的手册页以获取更多参考


-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
© www.soinside.com 2019 - 2024. All rights reserved.