использовать сортировку GNU для сортировки по одному ключу / предотвращения нежелательной сортировки других ключей

9

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

Как запретить сортировке GNU выполнять сортировку строк на основе значений ключей, которые я не указал, или как указать сортировку GNU, чтобы при сортировке игнорировать диапазон ключей?

Файл data.txt:

1 Don't
2 C 
1 Sort
2 B
1 Me
2 A

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

1 Don't
1 Sort
1 Me
2 C
2 B
2 A

Команда:

sort -k 1,1 <data.txt

Результат: нежелательная сортировка, о которой я не просил:

1 Don't
1 Me
1 Sort
2 A
2 B
2 C
Wil
источник

Ответы:

21

Вам нужна стабильная сортировка . От man sort:

-s, --stable
       stabilize sort by disabling last-resort comparison

а именно .:

$ sort -sk 1,1 <data.txt
1 Don't
1 Sort
1 Me
2 C 
2 B
2 A

Обратите внимание, что вы, вероятно, также хотите, чтобы -nили --numeric-sortесли ваш ключ числовой (например, вы можете получить неожиданные результаты, сравнивая 10 к 2 с лексическим порядком сортировки по умолчанию). В этом случае это просто вопрос выполнения:

sort -sn <data.txt

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

steeldriver
источник
Я прочитал документы, но правильное определение «стабильного» ускользнуло от моего внимания. Спасибо за быстрый, лаконичный и хорошо процитированный ответ. Первый ключ реальных данных - это локализованная строка, поэтому числовое значение для меня не подойдет.
Виль
4

Для (не GNU) sortреализаций, у которых нет -sопции, вы всегда можете сделать:

<data.txt awk '{print NR "\t" $0}' | sort -n -k 2,2 -k 1,1 | cut -f 2-

То есть, добавьте номер строки, чтобы сделать его вторым ключом сортировки, и удалите его после.

Стефан Шазелас
источник