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

 2021-04-09 

How to sort a file, based on its numerical values for a field?

示例file.txt

1
2
3
  100 foo
  2 bar
  300 tuu

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

1
2
3
  2 bar
  100 foo
  300 tuu

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


浏览手册页进行排序...

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

所以这是一个例子...

1
sort -n filename


如果要对混合文本字符串进行排序


好吧,这里的大多数其他答案是关于

1
sort -n

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

输入文件:

1
2
3
4
5
-0.907928466796875
-0.61614990234375
1.135406494140625
0.48614501953125
-0.4140167236328125

输出:

1
2
3
4
5
-0.4140167236328125
0.48614501953125
-0.61614990234375
-0.907928466796875
1.135406494140625

显然不是按数值排序的。

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

P.S .:对于本示例,使用sort -g返回的结果相同

编辑:

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

1
LC_ALL=C sort -n filename.txt

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

1
sort -n -k 1,1 File.txt


使用sort -nsort --numeric-sort


n


使用sort -nr进行降序排序。请参阅

排序

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    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