반응형
유닉스 종류의 버전 번호
버전 번호 목록이 있습니다. 예를 들어 버전 번호가 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
짝수 이전 ). 당신은 변경 될 수 있습니다-1
에0
당신이 고려하는 경우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
반응형
'IT Share you' 카테고리의 다른 글
Console.Clear를 사용하여 전체 콘솔 대신 한 줄만 지울 수 있습니까? (0) | 2020.12.02 |
---|---|
Apache VirtualHost 및 localhost (0) | 2020.12.02 |
Javascript switch 문 : 두 사례가 동일한 코드를 실행하는 방법이 있습니까? (0) | 2020.12.02 |
SCSS 컴파일시 거짓 양성 "정의되지 않은 변수"오류 (0) | 2020.12.02 |
Entity Framework 4에서 기본적으로 지연로드 비활성화 (0) | 2020.12.02 |