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


27

이것은 내가 정렬하려는 데이터입니다. 그러나 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 스크립트로 좋은 방법이 있습니까? 여기에 루비 또는 파이썬 스크립트를 사용할 수 없습니다.


"sort -nd"를 사용 해보세요
bobah

1
@bobah, "일종의 '옵션'-dn이 호환되지 않습니다"
maxschlepzig

10
sort -V할것이다.
Thor

2
@토르. 귀하의 의견은 좋은 답변을 제시 할 것입니다
Peter.O

답변:


21

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

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

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

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

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


난 당신이 문제를 해결하는 방식을 좋아합니다 :)
SHW

44

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

sort -V

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


이것이 얼마나 휴대 가능한지 아십니까? 이 옵션은 POSIX 사양의 일부가 아닌 것 같습니다.
어니스트 A

@ 어니스트 : 당신이 맞습니다, 이것은 GNU 정렬 특정 솔루션입니다. 메모를 추가했습니다.
Thor

@ 어니스트 : FreeBSD와 OpenBSD 가이 기능을 추가 한 것 같습니다.
Thor

숫자에 다른 접두사가 있으면 작동하지 않습니다.
Dante

1
모든 독자에게 : 이것은 CAPITAL V입니다! 사용 sort -V하지 마십시오 sort -v. 언뜻보기가 어렵습니다.
가브리엘 스테이플

7

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

sort -k 1.20n

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.