Como ordenar uma lista com números e valores nulos em ordem crescente?

1

Eu tenho uma lista de números e valores nulos. Como posso classificá-los de uma forma tal que os valores nulos cheguem ao final da lista usando sort em GNU coreutils ?

Uma coluna de amostra de entrada (input.data)

0.9000
23

1
2
5

-0.9000
-23

-1
-2
-5

Quando tentei com sort -g input.data , a saída é a seguinte.

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

Aqui, valores nulos são colocados no topo. É possível obter os valores nulos no final da lista? Esperado da seguinte forma:

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

EDIT: O objetivo de obter valores nulos na parte inferior é classificar um conjunto de dados com as linhas com valores nulos colocados na parte inferior.

Isso é o que eu espero,

| 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    |
    
por Ishan Madhusanka 16.10.2018 / 12:28

3 respostas

2

Você pode enviar o resultado por meio de um pós-processador adequado. Aqui está uma que eu escrevi em 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//

Se o seu sort realmente escreve <NULL> em vez de uma linha em branco, você precisará alterar o padrão /^$/ para /^<NULL>$/ .

Demonstração

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


 
    
por 16.10.2018 / 12:57
1

sort -g input.data | grep [0-9] && grep -v [0-9] input.data

  1. Classificar
  2. Filtre apenas números
  3. Adicione NULLs restantes invertendo o comando grep
por 16.10.2018 / 13:05
0

Com esta entrada de amostra:

$ 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

Use este comando:

$ sort -k 3n,3n -k 2g,2g infile

O que resulta nesta saída:

 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

Isso é diferente do Expected output da resposta em que a linha 11 value 10 vem apenas no final, em vez de antes da linha 4 value 3 . Atualize a pergunta se houver um motivo para uma solicitação 11 < 4 < 8 ou 10 < 3 < 7 ou se for mais para o problema do que os dados de amostra sugerem.

    
por 16.10.2018 / 14:40

Tags