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,2n | 2-е поле как число; к ключу можно приписать буквы 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