2013-11-09 11 views
3

Рассмотрим этот фрагмент:Сохранять первоначальный заказ, если числовое значение равно в сортировке coreutils?

echo '7 a 
3 c 
3 b 
2 first 
2 second 
2 third 
2 fourth 
2 fifth 
9 d 
2 sixth 
' | sort -n -k 1 

Это дает выход:

2 fifth 
2 first 
2 fourth 
2 second 
2 sixth 
2 third 
3 b 
3 c 
7 a 
9 d 

Хотя список правильно упорядоченное численно ключом по первому знаку, а также для тех значений, которые являются смежными и равны, оригинал порядок был перетасован. Я хотел бы получить:

2 first 
2 second 
2 third 
2 fourth 
2 fifth 
2 sixth 
3 c 
3 b 
7 a 
9 d 

Возможно ли это сделать с sort? Если нет, то каким будет самый простой способ добиться такого рода сортировки с помощью инструментов оболочки?

ответ

5

Просто добавьте (стабильные сортировки) флаг -s, это отключает последнего средство

echo '7 a 
3 c 
3 b 
2 first 
2 second 
2 third 
2 fourth 
2 fifth 
9 d 
2 sixth 
' | sort -k 1,1n -s 

2 first 
2 second 
2 third 
2 fourth 
2 fifth 
2 sixth 
3 c 
3 b 
7 a 
9 d 
+0

Огромное спасибо за это, @ 1_CR - на самом деле я заметил формулировку «последней версии» в manpage, потому что я думал, что это звучит странно - и не раз мне пришло в голову, что это связано с этим! Цените сниппет - привет! – sdaau

+0

В дополнение к '-s' вам нужно указать свой ключ как' -k 1,1', потому что 'KEYDEF - F [.C] [OPTS] [, F [.C] [OPTS]] для запуска и stop position' ... ', а позиция останова по умолчанию равна концу строки. Поэтому, если вы укажете '-k 1', вся строка будет использоваться для сортировки. Вы можете использовать '--debug', чтобы увидеть каждую строку, часть которой была использована для сортировки. –

+1

@benediktkoppel, действительно. Исправления – iruvar

1

Вы ищете «стабильный» вид. Попробуйте вариант -s (или, еще лучше, проверьте страницу руководства в вашей системе).

+0

Большое спасибо за этот jdigital - вы были первыми, но я оценил ответ в ответ @ 1_CR больше; Я проверил man-страницу, но я не мог сказать, что с этим связано «отключение последнего спарта». Ура! – sdaau

2

номер Добавить строки с nl, трубами для sort -k2,1 использовать номера строк в качестве вторичного ключа, а затем сократить число с cut. Или используйте sort -s. : p

+0

Большое спасибо за это, @Amadan - сначала я был «Что?»; и тогда я понял, что это была умная уловка ':)' Цените юмор - ура! – sdaau

 Смежные вопросы

  • Нет связанных вопросов^_^