Сортировка файла по первому, а затем по второму столбцу

13

Как я могу манипулировать разделенным табуляцией текстовым файлом с двумя столбцами, сортируя по первому элементу второго столбца (только если первый элемент столбца одинаков)?

Exemple:

Входной файл 1

A   1-2
A   6-8
A   3-4
B   7-10
B   5-9

Ожидаемый результат: файл 2

A   1-2
A   3-4
A   6-8
B   5-9
B   7-10
dovah
источник

Ответы:

22

Используйте sort«сек -kварианта , чтобы сортировать по (несколько) столбцам сразу:

$ sort -k1,1 -k2n input
A   1-2
A   3-4
A   6-8
B   5-9
B   7-10

-k1,1сортирует по первому столбцу, а затем -k2nпо второму - численно, когда был связан первый столбец, так что вы получите выходные данные в нужном вам порядке: сортировка по первому элементу второго столбца, только если первый элемент столбца совпадает.

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

Когда эти два ключа сравнивают одно и то же, тогда sortлексическое сравнение полных строк сравнивается в крайнем случае. Например, в A 1-10vs A 1-2, первые ключи идентичны ( Aстрока), а также второй ключ (оба обрабатываются как число 1), поэтому затем sortсравниваются A 1-10против A 1-2лексически, а последний больше как 2сортирует после1 . Реализация GNU sortимеет -Vопцию или Vфлаг ключа для выполнения сортировки версий , которая похожа на лексическое сравнение, за исключением того, что последовательности десятичных цифр в строках сравниваются численно, поэтому sort -k1,1 -k2Vсортировка выполняется A 1-10после A 1-2того, 10как число больше, чем 2.


¹ технически -k2означает часть строки, начинающуюся со второго поля (после первого перехода от непустого к пустому) и заканчивающуюся в конце строки, но с nфлагом, что эквивалентно -k2,2nтолько ведущей части это число считается.

Майкл Гомер
источник