Unix сортировка номеров версий - PullRequest
56 голосов
/ 20 декабря 2010

У меня есть список номеров версий, скажем, например, что они находятся в файле versions.txt

1.2.100.4
1.2.3.4
10.1.2.3
9.1.2.3

Я хочу отсортировать их так, чтобы они сортировались по версии.то есть:

1.2.3.4
1.2.100.4
9.1.2.3    
10.1.2.3

Я пытался использовать различные команды сортировки, используя параметры "k", но на самом деле не понимаю это достаточно хорошо, чтобы осуществить это.Любая помощь будет оценена.

Ответы [ 7 ]

103 голосов
/ 21 декабря 2010

Опция -V самая хорошая, но я хотел избежать установки нового / другого программного обеспечения, так как у моего вида такой опции не было.

Эта команда работала для меня вend:

sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n test.txt

Из комментариев:

  • Чтобы изменить порядок: sort -t. -k 1,1nr -k 2,2nr -k 3,3nr -k 4,4nr
  • Чтобы пропустить префикс v: sort -t. -k 1.2,1n -k 2,2n -k 3,3n -k 4,4n
70 голосов
/ 20 декабря 2010
sort -V versions.txt

С man sort:

-V, --version-sort
натуральный вид (версии) чисел в тексте

См. Также Подробная информация о сортировке версий .

3 голосов
/ 02 июня 2014

BSD по умолчанию не предоставляет -V, поэтому решение Бена настолько близко, насколько возможно.Для вашего удобства я разместил здесь нашу версию, которая может сортировать файлы типа <label>-<version>.<ext>:

% ls bla-*.ime | sed -Ee 's/^(.*-)([0-9.]+)(\.ime)$/\2.-1 \1\2\3/'  | sort -t. -n -k1,1 -k2,2 -k3,3 -k4,4 | cut -d\  -f2-
bla-1.ime
bla-1.0.ime
bla-1.0.0.ime
bla-1.1.ime
bla-1.1.29.ime
bla-1.2.3.ime
bla-1.2.29.ime
bla-1.2.30.ime
bla-1.3.ime
bla-1.3.0.ime
bla-1.3.1.ime
bla-1.3.10.ime
bla-1.3.20.ime
bla-1.7.ime
bla-1.11.29.ime
bla-2.3.2.ime
bla-11.2.2.ime

Краткое объяснение:

  • Список файлов, с которыми вы хотите отсортировать ls.
  • Найдите номер версии и добавьте к ней строку с префиксом.
  • При этом добавьте -1 в конец, чтобы сначала сортировать более короткий номер версии (даже до .0),Вы можете изменить -1 на 0, если считаете, что 1.3 эквивалентно 1.3.0.
  • Сортируйте строки, используя предложенное Беном решение по номеру версии.
  • Отберитепрефикс версии из строки.

Список теперь содержит отсортированный по версии список применимых имен файлов.Любая дополнительная сортировка в части label оставляется читателю в качестве упражнения.

1 голос
/ 29 мая 2015

Эта команда:

echo "1.2.100.4,1.2.3.4,10.1.2.3,9.1.2.3" | tr ',' '\n' | sort -V

Дает вывод:

1.2.3.4
1.2.100.4
9.1.2.3
10.1.2.3
0 голосов
/ 09 февраля 2014

В Perl:

sub compare_version_numbers {
   my ($l,$r) = @_;
   my @lx = split("\\.",$l);
   my @rx = split("\\.",$r);
   my $minlen = (@lx < @rx) ? @lx : @rx;
   for (my $i=0; $i < $minlen; $i++) {
      # make numeric by multiplying with 1
      my $l_number = ($lx[$i] * 1);
      my $r_number = ($rx[$i] * 1);
      # compare with spaceship operator
      my $l_vs_r = ($l_number <=> $r_number);
      # return if decision is clear!
      if ($l_vs_r != 0) {
         return $l_vs_r
      }
      # otherwise, next part in array of version numbers
   }
   # if we are here, we could not decide - shortest entry wins!
   return @lx <=> @rx
}
0 голосов
/ 13 февраля 2013
echo "1.2.100.4,1.2.3.4,10.1.2.3,9.1.2.3" | tr ',' '\n' | sort -k1,1n

Вывод:

1.2.100.4
1.2.3.4
9.1.2.3
10.1.2.3

Вы должны бытьв состоянии выяснить остальное.Удачи

0 голосов
/ 20 декабря 2010
sort -n <versions.txt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...