2016-08-06 3 views
1

Я всегда задавался вопросом, как sort работает при заказе нескольких столбцов в соответствии с их числовыми значениями. Например:сортировать несколько столбцов численно

echo -e " 2 3 \n 1 2 \n 2 10" | sort -n 

производит:

1 2 
2 10 
2 3 

и так делает sort -g. Если я хочу заказать численно второй столбец, а, единственное решение, которое я придумал это:

echo -e " 2 3 \n 1 2 \n 2 10" | sort -k1n -k2n 

, которая производит желаемый результат:

1 2 
2 3 
2 10 

Кто-то может понравиться объяснить это поведение и сказать, если существует более простое решение?

+0

«' -g »Сортировать численно, преобразуя префикс ** каждой строки ** в длинный номер с плавающей запятой двойной точности». – melpomene

ответ

1

Спецификация POSIX для sort говорит:

-n
Ограничить ключ сортировки начальным значением n umeric string, состоящий из необязательных символов <blank>, необязательного знака минус-знака и ноль или более цифр с необязательным символом-символом и символом-разделителем тысяч (как определено в текущей локали), которые должны сортироваться по арифметическому значению. Пустая строка цифр должна считаться нулевой. Ведущие нули и знаки на нулях не влияют на порядок.

Это по существу то же самое, что и -k1n,1. Если вы хотите отсортировать по нескольким столбцам численно, вы должны сказать:

sort -k1n,1 -k2n,2 … 

Будьте осторожны, опуская «конец поля» после запятых.

+0

Итак, в принципе нет другого способа, кроме указания опции -n для каждого столбца. благодаря – WolfNZO

-1

Simpler (ведущий -k1n не требуется), но не намного:

echo -e " 2 3 \n 1 2 \n 2 10" | sort -k2n 

Выход:

1 2 
2 3 
2 10 
+0

Это только сортирует один столбец численно. Вопрос заключается в том, как сортировать два столбца численно. Это действительно не отвечает на вопрос. –

+0

@JonathanLeffler. Если вопрос интерпретируется буквально, вход OP кажется нечетким совпадением для вопроса. Чтобы устранить такую ​​неопределенность, сегодня утром я рассматривал вопрос о том, что будет самым коротким и лучшим двухколоночным вводом для создания четырех различных «сортировочных» выходов для следующих четырех вариантов: 1. '-k1n' 2.' -k2n' 3. ' -k1n -k2n' 4. '-k2n -k1n'. Никогда не получал много прошлого «рассматриваемого» этапа ... но не нашел набор 2x3, который работает ... – agc

+0

Это неправильно: только случайно первый столбец отсортирован правильно. Если вы попробуете этот второй пример 'echo -e '10 3 \ n 1 2 \ n 2 10" | sort -k2n' вы понимаете, что в первом столбце значение 10 ставится до 2. – WolfNZO

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