- Команда sort в Linux
- Синтаксис
- Опции
- Примеры использования sort
- 1. Сортировка
- 2. Обратная сортировка
- 3. Сортировка по колонке
- 4. Сортировка по номеру
- 5. Удаление дубликатов
- 6. Сортировка по нескольким полям
- Похожие записи
- Оцените статью
- Об авторе
- 6 комментариев к “Команда sort в Linux”
- Sorting multiple keys with Unix sort
- 7 Answers 7
- sorting with multiple keys with Linux sort command
- 1 Answer 1
Команда sort в Linux
Сегодня мы поговорим о команде sort. Это утилита для вывода текстовых строк в определенном порядке. Проще говоря, для сортировки. Ее можно использовать для сортировки текста из одного или нескольких файлов или c помощью нее может быть выполнена сортировка вывода linux для какой-либо команды. Это может быть полезно во многих случаях. Например, отсортировать файлы по размеру в выводе команды du или собрать частотность использования команд из истории.
В этой инструкции мы подробно рассмотрим возможности команды sort Linux, ее опции и разберем несколько примеров использования.
Синтаксис
Уже по традиции подобных статей, сначала рассмотрим общий синтаксис команды:
$ sort опции файл
$ команда | sort опции
Опции
Теперь рассмотрим основные опции утилиты sort.
- -b — не учитывать пробелы
- -d — использовать для сортировки только буквы и цифры
- -i — сортировать только по ASCII символах
- -n — сортировка строк linux по числовому значению
- -r — сортировать в обратном порядке
- -с — проверить был ли отсортирован файл
- -o — вывести результат в файл
- -u — игнорировать повторяющиеся строки
- -m — объединение ранее отсортированных файлов
- -k — указать поле по которому нужно сортировать строки, если не задано, сортировка выполняется по всей строке.
- -f — использовать в качестве разделителя полей ваш символ вместо пробела.
Я понимаю, что многое из всего этого может быть непонятно, но на примерах все станет намного яснее.
Примеры использования sort
Наконец-то мы добрались к теме примеры sort Linux. Давайте сначала создадим файл с несколькими строками, на котором и будем проверять возможности утилиты.
computer
mouse
LAPTOP
data
RedHat
laptop
debian
laptop
Также можно воспользоваться вот такой командой:
echo -e «computer\nmouse\nLAPTOP\ndata\nRedHat\nlaptop\ndebian\nlaptop» > test.txt
Опция -e указывает команде, что нужно обрабатывать спецсимволы, а \n, если кто не знает, не что иное как спецсимвол перевода строки в Linux.
1. Сортировка
Теперь давайте выполним сортировку строк linux в нашем файле:
computer
data
debian
laptop
laptop
LAPTOP
mouse
RedHat
Вот несколько принципов, по которым команда sort linux сортирует строки:
- Строки с цифрами размещаются выше других строк
- Строки, начинающиеся с букв нижнего регистра размещаются выше
- Сортировка выполняется в соответствии алфавиту
- Строки сначала сортируются по алфавиту, а уже вторично по другим правилам.
2. Обратная сортировка
Отсортируем файл в обратном порядке:
RedHat
mouse
LAPTOP
laptop
laptop
debian
data
computer
3. Сортировка по колонке
Отсортируем вывод команды ls по девятой колонке, то есть по имени файла или папки. Колонку укажем опцией -k:
drwxr-xr-x 6 user user 4096 дек 6 14:29 Android
drwx—— 3 user user 4096 янв 14 22:18 Desktop
drwxr-xr-x 12 user user 4096 янв 14 21:49 Documents
drwx—— 5 user user 12288 янв 15 14:59 Downloads
drwxr-xr-x 7 user user 4096 янв 13 11:42 Lightworks
Сортировка вывода Linux выполняется так же просто как и строк из файла.
4. Сортировка по номеру
Отсортируем вывод команды ls по второй колонке. Для сортировки по числовому значению используется опция -n:
drwx—— 5 user user 12288 янв 15 14:59 Downloads
drwxr-xr-x 6 user user 4096 дек 6 14:29 Android
drwxr-xr-x 7 user user 4096 июн 10 2015 Sources
drwxr-xr-x 7 user user 4096 окт 31 15:08 VirtualBox
drwxr-xr-x 7 user user 4096 янв 13 11:42 Lightworks
drwxr-xr-x 8 user user 12288 янв 11 12:33 Pictures
5. Удаление дубликатов
Команда sort Linux позволяет не только сортировать строки, но и удалять дубликаты. Для этого есть опция -u:
computer
data
debian
laptop
LAPTOP
mouse
RedHat
Теперь строчка laptop не повторяется.
6. Сортировка по нескольким полям
Мы можем сортировать данные по нескольким полям. Например, отсортируем вывод ls по второму первично и вторично девятому полях:
drwxr-xr-x 2 seriyyy95 seriyyy95 4096 дек 6 14:32 Links
drwxr-xr-x 2 seriyyy95 seriyyy95 4096 янв 13 10:43 tmp
drwx—— 3 seriyyy95 seriyyy95 4096 янв 14 22:18 Desktop
drwxr-xr-x 3 seriyyy95 seriyyy95 4096 мар 28 2015 Журналы
drwx—— 4 seriyyy95 seriyyy95 12288 янв 15 15:42 Загрузки
Вот и все. Мы немного приоткрыли занавесу над возможностями сортировки строк linux с помощью команды sort. Если у вас остались вопросы — спрашивайте в комментариях!
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
Похожие записи
Оцените статью
Об авторе
Основатель и администратор сайта losst.ru, увлекаюсь открытым программным обеспечением и операционной системой Linux. В качестве основной ОС сейчас использую Ubuntu. Кроме Linux, интересуюсь всем, что связано с информационными технологиями и современной наукой.
6 комментариев к “Команда sort в Linux”
У вас в конце списка опций sort указана -f, а описание для неё взято от опции -t. Очепятка, однако 🙂 Ответить
Можно ли отобразить в одном столбце вывод команды full-upgrade? По умолчанию выводится список пакетов для обновления по строчно, что не очень удобно воспринимать. Ответить
Добрый день. Есть файлы:
1.txt
2.txt
3.txt
4.txt
5.txt
6.txt
7.txt
8.txt
9.txt
10.txt
11.txt
и так до, например, 1000. Отсортировать нужно по имени.
При использовании получается вот так:
53.ts 978.ts
530.ts 979.ts
531.ts 98.ts
532.ts 980.ts
533.ts 981.ts
534.ts 982.ts
535.ts 983.ts
536.ts 984.ts
537.ts 985.ts
538.ts 986.ts
539.ts 987.ts
54.ts 99.ts
540.ts input_list.txt
541.ts tsMuxeR
542.ts wget.list.m3u8
543.ts wget.log
544.ts Что мешает вам написать книгу.pdf
545.ts то есть 54.ts идет после 539.ts, но так не надо. Как отсортировать имена по порядку? PS ОС — Mac OS. Finder прекрасно сортирует так, как надо, но нужно вывод с путями к файлу положить в текстовый файл. Ответить
Добрый день! Точный ответ на Ваш вопрос даст man sort в Вашей ОС. Основываясь на материале статьи в cygwin провёл опыт:
ls -l | sort -n -k7
команда выше даёт сортировку списка файлов по столбцу даты — всё красиво.
Если поменять -k7 на -k9
, то будут отсортированы в порядке числовой нумерации в начале имён файлов. Ответить
Я как раз столкнулся с такой проблемой — названия директорий были в виде дат.
Решение вот такое :
ls | sort -t «.» -k2,5 -k9
20.10.2020
21.10.2020
22.10.2020
23.10.2020
24.10.2020 Ответить
Sorting multiple keys with Unix sort
I have potentially large files that need to be sorted by 1-n keys. Some of these keys might be numeric and some of them might not be. This is a fixed-width columnar file so there are no delimiters. Is there a good way to do this with Unix sort? With one key it is as simple as using ‘-n’. I have read the man page and searched Google briefly, but didn’t find a good example. How would I go about accomplishing this? Note: I have ruled out Perl because of the file size potential. It would be a last resort.
One or two lines of example data would be really helpful for to create example command line. Also, does «1-n» keys mean that you need to sort by a variable number of keys? Doing that without scripting is gonna be fun.
7 Answers 7
If you want to sort the file primarily by field 3, and secondarily by field 2 you want this:
-k, --key=POS1[,POS2] start a key at POS1 (origin 1), end it at POS2 (default end of line)
Nice! Now, what if I want fleld 3 to be numerically and reverse sorted whereas field 2 to be non-numerically and normal (ascending) sorted? 🙂
@Arun POS is explained at the end of the man page. You just append the ordering options to the field number like this: sort -k 3,3nr -k 2,2
Aargh. What a counterintuitive interface: -k2 should be -k2,2 and a trailing comma -k2, should be ‘magical default end of line or whatever’.
The -k option is what you want.
Would use character positions 4-5 in the first field (it’s all one field for fixed width) and sort numerically as the first key.
The second key would be characters 14-15 in the first field also.
Example (all I have is DOS/cygwin handy):
dir | \cygwin\bin\sort.exe -k 1.4,1.5n -k 1.40,1.60r
12/10/2008 01:10 PM 1,564,990 outfile.txt
Sorts the directory listing by month number (pos 4-5) numerically, and then by filename (pos 40-60) in reverse. Since there are no tabs, it’s all field 1 to sort.
Correction: if there are no /tabs/ in the input data. In DOS’s ‘dir’ command output, there are no tabs.
The examples on how to use the options (numeric, reverse) are extremely helpful, as it’s nearly impossible to find out how to use just from the man page and the other answers didn’t mention it. I wish I could +2 for this. 😉
Use the -k option (or —key=POS1[,POS2] ). It can appear multiple times and each key can have global options (such as n for numeric sort)
From the sort man page: «POS is F[.C][OPTS], where F is the field number and C the character position in the field; both are origin 1.» See man page for full documentation.
Here is one to sort various columns in a csv file by numeric and dictionary order, columns 5 and after as dictionary order
~/test>sort -t, -k1,1n -k2,2n -k3,3d -k4,4n -k5d sort.csv 1,10,b,22,Ga 2,2,b,20,F 2,2,b,22,Ga 2,2,c,19,Ga 2,2,c,19,Gb,hi 2,2,c,19,Gb,hj 2,3,a,9,C ~/test>cat sort.csv 2,3,a,9,C 2,2,b,20,F 2,2,c,19,Gb,hj 2,2,c,19,Gb,hi 2,2,c,19,Ga 2,2,b,22,Ga 1,10,b,22,Ga
Note the -k1,1n means numeric starting at column 1 and ending at column 1. If I had done below, it would have concatenated column 1 and 2 making 1,10 sorted as 110
~/test>sort -t, -k1,2n -k3,3 -k4,4n -k5d sort.csv 2,2,b,20,F 2,2,b,22,Ga 2,2,c,19,Ga 2,2,c,19,Gb,hi 2,2,c,19,Gb,hj 2,3,a,9,C 1,10,b,22,Ga
sorting with multiple keys with Linux sort command
I want to sort it by the second column and then by the third column. Column two are numbers, while column 3 can be treated as string. I know the following command works well.
$ sort -k2,2n -k3,3 a.txt f 1001 1 b 1001 2 a 1001 3 c 1002 4 d 1003 1 e 1004 2
$ sort -k2n a.txt a 1001 3 b 1001 2 f 1001 1 c 1002 4 d 1003 1 e 1004 2
Seems like it sorts by column two, and then by column one instead of column three. Why is this happening? Is it a bug or not? Cause sort -k2 a.txt works ok with above data since those numbers are just fixed width. My sort version is sort (GNU coreutils) 8.15 in cygwin.
Interesting. sort -k2 a.txt will work in this case. -k2 tells it to sort using a key that starts at field 2 and continues to the end of line. -k2n tells it to sort field 2 in numeric order; that might mean the sort key ends on encountering whitespace between fields 2 and 3. It might be a good idea to paste the version of your sort into the question somewhere.
@MikeSherrill’Catcall’ When you attempt to sort a non-numeric value numerically, sort(1) falls back to string sorting. «1001 3» etc. as by -k2n are not numeric.
I ran across this while trying to solve a similar problem: sort -k2 -u and sort -k2n -u yield different results on your file. I eventually figured out why ( a 1001 3 and b 1001 2 are both numerically identical to 1001, but not equal as strings), but, still, argh!
1 Answer 1
I find this caution in the GNU sort docs.
Sort numerically on the second field and resolve ties by sorting alphabetically on the third and fourth characters of field five. Use ‘:’ as the field delimiter.
Note that if you had written -k 2n instead of -k 2,2n sort would have used all characters beginning in the second field and extending to the end of the line as the primary numeric key. For the large majority of applications, treating keys spanning more than one field as numeric will not do what you expect.
I’m not sure what it ends up with when it evaluates ‘1001 3’ as a numeric key, but «will not do what you expect» is accurate. It seems clear that the Right Thing to do is to specify each key independently.
The same web page says this about resolving «ties».
Finally, as a last resort when all keys compare equal, sort compares entire lines as if no ordering options other than —reverse (-r) were specified.
I’ll confess I’m a little mystified about how to interpret that.