Как отсортировать список чисел и нулевых значений в порядке возрастания, с нулевыми значениями в конце?
У меня есть список чисел и нулевых значений. Как я могу отсортировать их так, чтобы нулевые значения доходили до конца списка с помощью 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/^. //'
Преимущество заключается в том, что команда читает входные данные только один раз, поэтому вы можете использовать их в конвейере.
Объяснение:
- Первый
sedдобавляет1(обратите внимание на пробел) перед каждой строкой. Если1теперь вся строка (что означает, что исходная строка была пустой), она будет заменена на2, Это создает дополнительный столбец, который указывает, была ли исходная строка пустой или нет. sortсказано сортировать по первому (дополнительному) столбцу, только затем по второму.- Финал
sedудаляет все, что добавлено первым.
Замечания:
- В общем
sortиспользует локаль ( подробности). Я сознательно выбрал цифры1а также2и числовая сортировка, чтобы заставить весь трюк работать в любом (?) нормальном западном регионе.