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

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

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

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

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

Объяснение:

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

Замечания:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .