
数値とnull値のリストがあります。 null値がリストsort
の終わりに達するようにinを使用してソートする方法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
ここでは、NULL値が一番上に配置されます。リストの末尾にnull値を入れることはできますか?次を期待してください:
-23
-5
-2
-1
-0.9000
0.9000
1
2
5
23
<NULL>
<NULL>
<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
と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