제가 정렬하고 싶은 데이터입니다. 그러나 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
.)
숫자가 아닌 부품이 여러 개 있는 경우센티넬 삽입.