Как отсортировать список чисел и нулевых значений в порядке возрастания, с нулевыми значениями в конце?

У меня есть список чисел и нулевых значений. Как я могу отсортировать их так, чтобы нулевые значения доходили до конца списка с помощью sort в GNU coreutils?

Пример ввода (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

Здесь нулевые значения размещены сверху. Можно ли получить нулевые значения в конце списка?

2 ответа

Я предполагаю, что ваши нулевые значения просто пустые строки.

Если ваше единственное требование состоит в том, чтобы в конце были пустые строки, просто измените порядок в обратном порядке, конечно, это также изменит порядок чисел. Вот несколько вариантов бок о бок:

$ 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)

Создайте дополнительный столбец и сначала отсортируйте его, а в конце удалите:

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

Преимущество заключается в том, что команда читает входные данные только один раз, поэтому вы можете использовать их в конвейере.

Объяснение:

  1. Первый sed добавляет 1 (обратите внимание на пробел) перед каждой строкой. Если 1 теперь вся строка (что означает, что исходная строка была пустой), она будет заменена на 2 , Это создает дополнительный столбец, который указывает, была ли исходная строка пустой или нет.
  2. sort сказано сортировать по первому (дополнительному) столбцу, только затем по второму.
  3. Финал sed удаляет все, что добавлено первым.

Замечания:

  • В общем sort использует локаль ( подробности). Я сознательно выбрал цифры 1 а также 2 и числовая сортировка, чтобы заставить весь трюк работать в любом (?) нормальном западном регионе.
Другие вопросы по тегам