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

Автор: | 11/22/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.