bash 스크립트를 사용하여 문자열+숫자 조합의 문자열을 정렬하는 방법은 무엇입니까?

bash 스크립트를 사용하여 문자열+숫자 조합의 문자열을 정렬하는 방법은 무엇입니까?

제가 정렬하고 싶은 데이터입니다. 그러나 sort숫자를 문자열로 처리하면 데이터가 예상대로 정렬되지 않습니다.

/home/files/profile1
/home/files/profile10
/home/files/profile11
/home/files/profile12
/home/files/profile14
/home/files/profile15
/home/files/profile16
/home/files/profile2
/home /file/profile3
/main/file/profile4
/master/file/profile5 /master /file/profile6
/ master/file/profile7 /master/file/profile8 /master/file /profile9


나는 그것을 다음과 같이 정렬하고 싶다.

/home/files/profile1
/home/files/profile2
/home/files/profile3
/home/files/profile4
/home/files/profile5
/home/files/profile6
/home/files/profile7
/home/files/profile8
/home /file/profile9
/home/file/profile10 /home/ file/profile11 /
home /file/profile12 /home/file/profile14 /home/file/profile15 /home/file /profile16



Bash 스크립트로 이를 수행할 수 있는 좋은 방법이 있습니까? 여기서는 Ruby나 Python 스크립트를 사용할 수 없습니다.

답변1

이는 다음과 매우 유사합니다.이 문제. 문제는 정렬하려는 영숫자 필드가 있고 -n이를 현명하게 처리하지 않지만 버전 sort( -V)는 처리한다는 것입니다. 따라서 다음을 사용하십시오.

sort -V

이 기능은 현재 GNU, FreeBSD 및 OpenBSD 정렬 구현에서 지원됩니다.

답변2

임시 감시 문자를 사용하여 숫자를 구분할 수 있습니다.

$ sed 's/\([0-9]\)/;\1/' log | sort -n -t\; -k2,2 | tr -d ';'

여기서 감시 문자는 ";"입니다. 이는 정렬하려는 파일 이름의 일부가 될 수 없습니다. 그러나 ";"를 원하는 문자로 바꿀 수 있습니다. 이에 따라 sed, sort및 섹션을 변경해야 합니다 tr.

파이프라인은 다음과 같이 작동합니다. sed명령은 숫자 앞에 마커를 삽입하고, sort명령은 마커를 필드 구분 기호로 해석하고, 두 번째 필드를 숫자 정렬 키로 사용하여 정렬한 다음, tr명령이 마커를 다시 제거합니다.

및 입력 파일을 나타냅니다 . log입력을 .sed

답변3

모든 파일 이름의 마지막 숫자 부분 앞에 동일한 접두사가 있으면 정렬 시 무시됩니다.

sort -k 1.20n

(20은 첫 번째 숫자의 위치입니다. 1에 를 더한 길이입니다 /home/files/profile.)

숫자가 아닌 부품이 여러 개 있는 경우센티넬 삽입.

관련 정보