如何对数字和空值列表进行升序排序,并将空值放在末尾?

如何对数字和空值列表进行升序排序,并将空值放在末尾?

我有一个数字和空值列表。如何使用以下方式对它们进行排序,使空值位于列表末尾种类GNU 核心实用程序

示例输入(input.data)

0.9000
23

1
2
5

-0.9000
-23

-1
-2
-5

当我尝试使用时sort -g input.data,输出如下。

<NULL>
<NULL>
<NULL>
-23
-5
-2
-1
-0.9000
0.9000
1
2
5
23

此处将空值放在顶部。是否可以将空值放在列表末尾?

答案1

我认为你的空值只是空行。

如果您的唯一要求是空行位于末尾,那么只需反转顺序即可,当然这也会改变数字的顺序。以下是一些并排的变体:

$ sort -g file           $ sort -gr file          $ sort -r file
                         23                       5
                         5                        -5
                         2                        23
-23                      1                        -23
-5                       0.9000                   2
-2                       -0.9000                  -2
-1                       -1                       1
-0.9000                  -2                       -1
0.9000                   -5                       0.9000
1                        -23                      -0.9000
2                                                 
5                                                 
23                                                

如果数字的顺序必须如此sort -g,并且只有空行应该移动到末尾,您可以简单地删除所有空行并将其粘贴在末尾。

grep . file | sort -g | cat - <(grep -v . file)

答案2

首先创建一个额外的列并按其排序,最后将其删除:

<input.data sed 's/^/1 /; s/^1 $/2 /' | sort -k 1n -k 2g | sed 's/^. //'

优点是该命令只读取一次输入,因此您可以在管道中使用它。

解释:

  1. 第一个在每一行前面sed添加(注意尾随空格)。如果现在是整行(这意味着原始行为空),它将被替换为。这会创建一个额外的列,指示原始行为空还是不空。112
  2. sort被告知先按照第一列(额外列)排序,然后再按照第二列排序。
  3. 最后一个sed将删除第一个添加的所有内容。

笔记:

  • 一般sort使用语言环境 (细节)。我特意选择了数字12数值排序,以使整个技巧在任何(?) 合理的西方语言环境中都能发挥作用。

相关内容