find
응답을 사용하고 정렬하고 싶습니다 . 나는 간단한 파이프라인이 find ... | sort
그 일을 해낼 것이라고 생각했지만, 정렬 동작이 이상합니다. 작업을 단순하게 유지하려면 간단한 텍스트 파일을 사용하세요.
asdf/2/22
asdf/2/01
asdf/20/0
asdf/20/1
내 예상 결과는
asdf/2/01
asdf/2/22
asdf/20/0
asdf/20/1
또는
asdf/20/0
asdf/20/1
asdf/2/01
asdf/2/22
디렉토리가 그룹에 나타나기를 원하기 때문에 중요하지 않습니다.
내 시도는 다음과 같습니다.
[root@linux6 ~]# cat sort_test | sort
asdf/20/0
asdf/2/01
asdf/20/1
asdf/2/22
[root@linux6 ~]# cat sort_test | sort -d
asdf/20/0
asdf/2/01
asdf/20/1
asdf/2/22
[root@linux6 ~]# cat sort_test | tr "/" "X" | sort
asdfX20X0
asdfX20X1
asdfX2X01
asdfX2X22
[root@linux6 ~]# cat sort_test | tr "/" "_" | sort
asdf_20_0
asdf_2_01
asdf_20_1
asdf_2_22
[root@linux6 ~]#
"X"에서만 작동한다는 점에 유의하세요. 영숫자가 아닌 문자가 있으면 출력이 손상된 것 같습니다. 나는 또한 출력에 변화가 없는 옵션을 -s
시도 했습니다.-t '/'
sort
정렬할 -d
항목이 없다고 언급했는데도 영숫자가 아닌 문자가 먼저 제거된 다음 행이 정렬되는 것 같습니다.alias
[root@linux6 ~]# which sort
/usr/bin/sort
[root@linux6 ~]# uname -a
Linux i-epg-appl1 3.10.0-229.14.1.el7.x86_64 #1 SMP Tue Sep 15 15:05:51 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@linux6 ~]# sort --version
sort (GNU coreutils) 8.22
답변1
첫째, /
로케일에서 정렬할 때 무시됩니다(대부분의 로케일에서 컬렉션 사양의 마지막 가중치를 제외한 모든 항목은 GNU 시스템(내 데비안 시스템)에 있음을 알 수 있습니다 ) . /
따라서 정렬 기준 은 정렬과 같습니다. , 마치 당신이 사용한 적이 있는 것처럼 .IGNORE
<U002F> IGNORE;IGNORE;IGNORE;<U002F> # 45 /
/usr/share/i18n/locales/iso14651_t1_common
asdf/20/0
asdf/2/01
asdf200
asdf201
-d
로케일을 C로 변경할 수 있습니다. 여기서 정렬은 바이트 값만을 기준으로 합니다(그리고 /
정렬이 발생하는 경우도 있습니다).앞으로숫자)이므로 이전과 같이 정렬되지만 asdf/2/01
예 를 들어 여전히 이의 제기 문제가 있습니다 .asdf/20/0
/
0
asdf/2
asdf/10
-g
여기에서 GNU 특정 / 옵션을 사용 --general-numeric-sort
하거나 다음을 수행할 수 있습니다.
sort -nt/ -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 -k6,6 -k7,7 -k8,8 -k9,9
각 디렉토리 구성 요소를 숫자로 처리합니다(이렇게 하면 앞에 2_가 정렬됩니다).
를 사용하면 zsh
다음을 수행할 수 있습니다.
printf '%s\n' **/*(Dn)
재귀적인 전역 숫자 정렬을 수행합니다.
답변2
따라서 질문을 요약하기 위해 답변은 LC_COLLATE
@don_crissti가 댓글에서 언급한 내용으로 설정됩니다.
$ LC_COLLATE=C sort infile