다음과 같은 파일이 있습니다.
foo03a
foo02b
quux01a
foo01a
foo02a
foo01b
foo03b
quux01b
a
마지막 문자(so 및 b
함께 표시됨)를 기준으로 정렬한 다음 앞의 숫자, 접두사(필수는 아니지만)를 기준으로 정렬하고 싶습니다 . 결과는 다음과 같습니다.
foo01a
quux01a
foo02a
foo03a
foo01b
quux01b
foo02b
foo03b
quux01a
실제로 quux01b
관련 그룹에 속해 있는 한 표시되는 위치는 특별히 중요하지 않습니다. 표시된 대로 foo01b
앞이나 뒤에 나타날 수 있습니다 foo03b
.
왜? 이는 블루/그린 배포에 사용되는 서버 이름이므로 "A" 서버를 함께 사용하고 "B" 서버를 함께 사용하고 싶습니다.
GNU 정렬로의 전환을 찾았 -k
지만 이를 사용하여 문자열 끝에서 계산할 특정 문자를 지정하는 방법을 이해하지 못합니다.
시도했지만 cat foos | rev | sort | rev
잘못된 위치에 도달했습니다 foo10a
( foo10b
우리가 그렇게 멀리 계산했을 때).
답변1
awk
GNU 함수를 사용하여 솔루션을 찾았습니다 match
.
cat foos | \
gawk 'match($0, /([^0-9]+)([0-9]+)([^0-9]+)/, a) {print a[3], a[2], $0}' | \
sort | cut -d' ' -f3
이 gawk
명령은 정규식 캡처를 사용하여 정렬 키를 생성하므로 다음과 같이 끝납니다.
a 03 foo03a
b 02 foo02b
...등.
그것을 실행 sort
하고 cut
내가 원하는 필드를 찾으십시오. 완벽한.
답변2
필드(여기서는 필드 1)의 sort
문자 위치(다음 숫자로 표시됨)를 전달할 수 있습니다 ..
sort -k1.6 -k1.4,1.5n -k1.1,1.3 file.txt
예:
$ cat file.txt
foo03a
foo02b
foo01a
foo02a
foo01b
foo03b
$ sort -k1.6 -k1.4,1.5n -k1.1,1.3 file.txt
foo01a
foo02a
foo03a
foo01b
foo02b
foo03b
반대로 다음을 사용하십시오 rev
.
$ rev file.txt | sort -k1.1,1.1 -k1.2,1.3n -k1.4 | rev
foo01a
foo02a
foo03a
foo01b
foo02b
foo03b