BASH: sort по заданному полю

Автор: | 22/11/2013

terminalНебольшая заметка о возможностях команды sort.

Имеется небольшой скрипт, который выводит список последних доступных версий программы:

$ ./version.sh
4.4.0.29
4.4.0.30
4.4.0.31
4.4.0.4
4.4.0.8

Проблема в том, что sort никак не мог выполнить “правильную” сортировку чисел, считая .4 и .8 больше, чем .31, даже при использовании ключей -n и -g:

$ ./version.sh | sort -n
4.4.0.29
4.4.0.30
4.4.0.31
4.4.0.4
4.4.0.8
$ ./version.sh | sort -g
4.4.0.29
4.4.0.30
4.4.0.31
4.4.0.4
4.4.0.8

Решение – использовать ключи -t и -k:

$ ./version.sh | sort -n -t . -k 4.1
4.4.0.4
4.4.0.8
4.4.0.29
4.4.0.30
4.4.0.31

Тут:

-t, --field-separator – разделитель полей, по которому вести отсчёт;
-k, --key – ключи, по которым выполнять сортировку.

В данном случае – разделителем установлена точка, а сортировка выполняется по первому полю четвёртого ключа, т.е. при сортировке “отсекаются” первые три поля – 4.4.0.