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

325
Ishan Madhusanka

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

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

0

2 ответа на вопрос

2
Socowi

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

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

$ 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) 
1
Kamil Maciorowski

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

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

Похожие вопросы