Как отсортировать список чисел и нулевых значений в порядке возрастания, с нулевыми значениями в конце?
У меня есть список чисел и нулевых значений. Как я могу отсортировать их так, чтобы нулевые значения доходили до конца списка с помощью 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
и числовая сортировка, чтобы заставить весь трюк работать в любом (?) нормальном западном регионе.