我有一个数字和空值列表。如何使用 in 对它们进行排序,使空值到达列表的sort
末尾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
这里空值被放置在顶部。是否可以将空值放到列表末尾?预计如下:
-23
-5
-2
-1
-0.9000
0.9000
1
2
5
23
<NULL>
<NULL>
<NULL>
编辑:将空值放在底部的目的是对一组数据进行排序,并将空值的行放在底部。
这就是我所期待的,
| Sample Input || Current output || Expected output |
|-------------------------------||-------------------------------||----------------------------|
| 2 0.9000 value 1 || 11 value 10 || 10 -23 value 9 |
| 3 23 value 2 || 4 value 3 || 14 -5 value 13 |
| 4 value 3 || 8 value 7 || 13 -2 value 12 |
| 5 1 value 4 || 10 -23 value 9 || 12 -1 value 11 |
| 6 2 value 5 || 14 -5 value 13 || 9 -0.9000 value 8 |
| 7 5 value 6 || 13 -2 value 12 || 2 0.9000 value 1 |
| 8 value 7 || 12 -1 value 11 || 5 1 value 4 |
| 9 -0.9000 value 8 || 9 -0.9000 value 8 || 6 2 value 5 |
| 10 -23 value 9 || 2 0.9000 value 1 || 7 5 value 6 |
| 11 value 10 || 5 1 value 4 || 3 23 value 2 |
| 12 -1 value 11 || 6 2 value 5 || 11 value 10 |
| 13 -2 value 12 || 7 5 value 6 || 4 value 3 |
| 14 -5 value 13 || 3 23 value 2 || 8 value 7 |
答案1
您可以通过合适的后处理器传输结果。这是我用 sed 写的:
#!/bin/sed -f
# Move any null into hold space
/^$/{
H
d
}
# Insert nulls after last line
$G
# Delete an extra newline this introduces
$s/\n//
如果您sort
确实写入<NULL>
而不是空行,则需要将模式更改/^$/
为/^<NULL>$/
.
演示
sort -g <<EOF | ./475768.sed
0.9000
23
1
2
5
-0.9000
-23
-1
-2
-5
EOF
-23
-5
-2
-1
-0.9000
0.9000
1
2
5
23
答案2
sort -g input.data | grep [0-9] && grep -v [0-9] input.data
- 种类
- 仅过滤数字
- 通过反转 grep 命令添加剩余的 NULL
答案3
您可以使用标志V
and r
in ,sort
如下所示:
sort -Vr file
-23
-5
-2
-1
-0.9000
23
5
2
1
0.9000
.
根据排序人:
-r, --reverse reverse the result of comparisons
-V, --version-sort natural sort of (version) numbers within text
答案4
使用此示例输入:
$ cat infile
2 0.9000 value 1
3 23 value 2
4 value 3
5 1 value 4
6 2 value 5
7 5 value 6
8 value 7
9 -0.9000 value 8
10 -23 value 9
11 value 10
12 -1 value 11
13 -2 value 12
14 -5 value 13
使用这个命令:
$ sort -k 3n,3n -k 2g,2g infile
其结果是这样的输出:
10 -23 value 9
14 -5 value 13
13 -2 value 12
12 -1 value 11
9 -0.9000 value 8
2 0.9000 value 1
5 1 value 4
6 2 value 5
7 5 value 6
3 23 value 2
4 value 3
8 value 7
11 value 10
这与答案不同Expected output
,因为该11 value 10
行位于末尾,而不是该4 value 3
行之前。如果有理由进行11 < 4 < 8
或10 < 3 < 7
排序,或者问题比示例数据表明的更严重,请更新问题。