이것은 내가 정렬하려는 데이터입니다. 그러나 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
.)
당신은 여러 가지 숫자가 아닌 부분이있는 경우, 센티넬를 삽입합니다 .