IT Share you

유닉스 종류의 버전 번호

shareyou 2020. 12. 2. 22:13
반응형

유닉스 종류의 버전 번호


버전 번호 목록이 있습니다. 예를 들어 버전 번호가 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"매개 변수를 사용하여 다양한 정렬 명령을 사용해 보았지만 실제로는 충분히 이해하지 못했습니다. 어떤 도움을 주시면 감사하겠습니다.


-V옵션이 가장 좋지만 내 종류에는 해당 옵션이 없었기 때문에 새 / 다른 소프트웨어를 설치하지 않으려 고했습니다.

이것은 결국 나를 위해 일한 명령입니다.

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

sort -V versions.txt

에서 man sort:

-V, --version-sort
텍스트 내의 자연스러운 종류의 (버전) 번호

버전 정렬에 대한 세부 정보를 참조하십시오 .


BSD는 -V기본적으로 제공하지 않으므로 Ben의 솔루션은 최대한 가깝습니다. 편의를 위해 다음과 같은 파일을 정렬 할 수있는 버전을 여기에 게시합니다 <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짝수 이전 ). 당신은 변경 될 수 있습니다 -10당신이 고려하는 경우 1.3에 해당 될 1.3.0.
  • 버전 번호에 대해 Ben이 제안한 솔루션을 사용하여 줄을 정렬합니다.
  • 줄에서 버전 접두사를 잘라냅니다.

이제 목록에는 적용 가능한 파일 이름의 버전 정렬 목록이 포함됩니다. label부품 에 대한 추가 정렬 은 독자에게 연습으로 남겨집니다.


이 명령 :

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

Gives output:

1.2.3.4
1.2.100.4
9.1.2.3
10.1.2.3

In 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
}

sort -n <versions.txt


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

Output:

1.2.100.4
1.2.3.4
9.1.2.3
10.1.2.3

You should be able to figure out the rest. Good luck

참고URL : https://stackoverflow.com/questions/4493205/unix-sort-of-version-numbers

반응형