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

이것은 내가 정렬하려는 데이터입니다. 그러나 sort숫자를 문자열로 처리합니다. 예상대로 정렬되지 않은 데이터입니다.

/ 가정 / 파일 / profile1
/ 홈 / 파일 / profile10
/ 홈 / 파일 / profile11
/ 홈 / 파일 / profile12
/ 홈 / 파일 / profile14
/ 홈 / 파일 / profile15
/ 홈 / 파일 / profile16
/ 홈 / 파일 / PROFILE2
/ 집 / 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 / 파일 / profile9
/ 홈 / 파일 / profile10
/ 홈 / 파일 / profile11
/ 홈 / 파일 / profile12
/ 홈 / 파일 / profile14
/ 홈 / 파일 / profile15
/ 홈 / 파일 / profile16

bash 스크립트로 좋은 방법이 있습니까? 여기에 루비 또는 파이썬 스크립트를 사용할 수 없습니다.



답변

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

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

센티넬 문자는 ‘;’입니다. -정렬하려는 파일 이름의 일부가 아니어야합니다. 그러나 ‘;’ 당신이 좋아하는 어떤 문자로. 당신은을 변경해야 할 sed, sort그리고 tr그에 따라 다음 부분.

파이프는 다음과 같이 작동합니다.이 sed명령은 숫자 앞에 센티넬을 삽입하고 sort, 센티넬을 필드 구분 기호로 해석하고, 두 번째 필드를 숫자 정렬 키로 정렬 한 tr후, 센티넬을 다시 제거합니다.

그리고 log입력 파일을 나타냅니다. 입력을에 파이프 할 수도 있습니다 sed.


답변

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

sort -V

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


답변

마지막 숫자 부분 앞에 모든 파일 이름의 접두사가 동일한 경우 정렬 할 때 무시하십시오.

sort -k 1.20n

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

당신은 여러 가지 숫자가 아닌 부분이있는 경우, 센티넬를 삽입합니다 .