我有一个数字和空值列表。如何使用以下方式对它们进行排序,使空值位于列表末尾种类在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/^. //'
优点是该命令只读取一次输入,因此您可以在管道中使用它。
解释:
- 第一个在每一行前面
sed
添加(注意尾随空格)。如果现在是整行(这意味着原始行为空),它将被替换为。这会创建一个额外的列,指示原始行为空还是不空。1
1
2
sort
被告知先按照第一列(额外列)排序,然后再按照第二列排序。- 最后一个
sed
将删除第一个添加的所有内容。
笔记:
- 一般
sort
使用语言环境 (细节)。我特意选择了数字1
和2
数值排序,以使整个技巧在任何(?) 合理的西方语言环境中都能发挥作用。