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 /files/profile3
/home/files/profile4
/home/files/profile5
/home/files/profile6
/
home/files/profile7 /home/files/profile8
/home/files/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 /files/profile9
/home/files/profile10 /home/ files/profile11 /
home /files/profile12 /home/files/profile14 /home/files/profile15 /home/files/profile16



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

답변1

이는 다음과 매우 유사합니다.이 질문. 문제는 정렬 중인 영숫자 필드가 있고 -n이를 현명하게 처리하지 않는다는 것입니다. 그러나 버전 정렬( -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.)

숫자가 아닌 부품이 여러 개 있는 경우파수꾼을 삽입하다.

관련 정보