← Весь справочник

sort

Сортировка строк — по алфавиту, числам, размерам, версиям и отдельным столбцам

sort читает строки из файлов или стандартного ввода и печатает их упорядоченными. По умолчанию сравнивает строки целиком как текст; опции включают числовое сравнение, обратный порядок и сортировку по отдельному столбцу. Несколько файлов сливаются в один отсортированный поток.

Синтаксис

sort [опции] [файл…]
sort -k НАЧАЛО[,КОНЕЦ][тип] [-t разделитель] [файл…]

Опции

Как сравнивать

ОпцияЧто делает
-nкак числа: 9 раньше 10; понимает минус и десятичную точку
-gкак числа с плавающей точкой, понимает 1e3, inf (медленнее -n)
-hкак размеры с суффиксами: 512 < 1K < 2M < 1G (вывод du -h, ls -lh)
-Vкак версии: 1.2 < 1.9 < 1.10, file2 < file10
-Mкак названия месяцев: JAN < FEB < … < DEC
-fбез учёта регистра
-dучитывать только буквы, цифры и пробелы
-iигнорировать непечатаемые символы
-bигнорировать пробелы в начале поля
-rобратный порядок
-Rперемешать (одинаковые строки останутся рядом)

Ключи и разделитель

ОпцияЧто делает
-k 2ключ — от 2-го поля до конца строки
-k 2,2ключ — только 2-е поле
-k 2,2n2-е поле как число; к ключу можно приписать буквы bdfgiMhnRrV
-b -k 2.3,2.5символы с 3-го по 5-й во втором поле (без -b или -t отсчёт идёт от пробелов перед полем)
-k1,1 -k3,3nrнесколько ключей: следующий решает только при равенстве предыдущих
-t ','разделитель полей. По умолчанию поле начинается там, где пробел сменяется непробелом, и включает ведущие пробелы

Прочее

ОпцияЧто делает
-uиз одинаковых (по ключу!) строк оставить первую
-sстабильная сортировка: равные по ключу строки сохраняют исходный порядок
-o файлзаписать результат в файл; можно в тот же, что на входе
-cтолько проверить, отсортирован ли ввод: печатает первую строку не на месте, код 1; -C — то же молча
-mслить уже отсортированные файлы, не сортируя заново
-zстроки разделены нулевым байтом (для find -print0)
--debugподчеркнуть, какую часть строки sort считает ключом, и предупредить о подозрительных опциях
-S 50%, -T каталог, --parallel=4память под буфер, каталог для временных файлов, число потоков — для очень больших файлов

Примеры

# числа: без -n строки сравниваются посимвольно
printf '10\n9\n100\n' | sort
printf '10\n9\n100\n' | sort -n

# по второму столбцу как по числу, по убыванию
printf 'b 2\na 10\nc 1\n' | sort -k2,2nr

# CSV: по второму полю
printf 'x,3\ny,1\nz,2\n' | sort -t, -k2,2n

# два ключа: по первому полю, при равенстве — по второму как число
printf 'a 2 x\na 1 y\nb 0 z\n' | sort -k1,1 -k2,2n

# /etc/passwd по UID
sort -t: -k3,3n /etc/passwd | head -n 3

# размеры в человекочитаемом виде — крупнейшие сверху
du -sh /var/* 2>/dev/null | sort -rh | head -n 5

# версии и имена с номерами
printf '1.10\n1.9\n1.2\n' | sort -V
printf 'file10\nfile2\nfile1\n' | sort -V

# уникальные строки
printf 'c\na\nb\na\n' | sort -u

# без учёта регистра
printf 'b\nB\na\nA\n' | sort -f

# отсортировать файл «на месте»
printf 'b\na\n' > list.txt
sort -o list.txt list.txt

# проверить, отсортирован ли файл
sort -c list.txt && echo 'отсортирован'

# посмотреть, что sort считает ключом
printf 'x 10\ny 9\n' | sort --debug -k2,2n

Подводные камни

  • sort файл > файл стирает файл. Оболочка обнуляет его до запуска sort. Используй sort -o файл файл.
  • -k2 — это «со второго поля до конца строки», а не «второе поле». Ограничивай ключ: -k2,2.
  • Буквы у ключа отменяют общие опции для него. В sort -n -k2,2r второй ключ сравнивается уже как текст: у него своя буква r, и общий -n к нему не применяется. Пиши всё в ключе: -k2,2nr.
  • Без -n числа сортируются как текст: 10 < 100 < 9.
  • Порядок зависит от локали. В песочнице локаль POSIX (C): сравниваются байты, поэтому все заглавные идут раньше строчных (A B a b), а пробелы и цифры — раньше букв. На системе с en_US.UTF-8 тот же ввод отсортируется иначе (a A b B, знаки препинания почти не учитываются). Для предсказуемого результата в скриптах задавай LC_ALL=C sort.
  • Десятичный разделитель тоже от локали. В C это точка: 1,5 для sort -n — просто 1.
  • Ведущие пробелы входят в поле. Без -t и -b в выровненном пробелами выводе строка x b (два пробела) встанет раньше y a (один пробел) при -k2,2: пробел меньше любой буквы. Добавь -b или задай разделитель -t.
  • sort -u сравнивает только ключ. С -k строки, у которых ключ совпадает, схлопнутся, даже если отличаются в других столбцах.
  • -h сначала сравнивает суффиксы, потом числа: 2000 окажется меньше 1K. Сортируй вывод, где все размеры записаны одинаково (du -h, ls -lh).

См. также

uniq · cut · awk · head и tail · df и du