입력한 마지막 문자를 기준으로 정렬한 다음 이전 숫자를 기준으로 정렬하시겠습니까?

입력한 마지막 문자를 기준으로 정렬한 다음 이전 숫자를 기준으로 정렬하시겠습니까?

다음과 같은 파일이 있습니다.

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

awkGNU 함수를 사용하여 솔루션을 찾았습니다 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

관련 정보