이름에 있는 숫자를 기준으로 파일을 정렬하고 싶습니다. 파일은 다음과 같습니다.
$ ls *.f
0.f 13.f 1.f 22.f 4.f abc.f
결과 정렬:
$ ls *.f | sort -t. -k1n
0.f
abc.f # note this file!
1.f
4.f
13.f
22.f
내가 기대하는 것은:
$ ls *.f | sort -t. -k1n
abc.f
0.f
1.f
4.f
13.f
22.f
왜 이전과 이후 abc.f
만 표시하나요 ? 숫자로 간주되지 않기 때문인가요 ? 온라인으로 검색했는데 참고 자료를 찾지 못했습니다.0.f
1.f
0
sort
답변1
그 이유는 숫자를 사용하여 정렬할 때 숫자가 없는 문자열은 0으로 처리되기 때문입니다. GNU 정렬은 올바르게 작동하지만 그 이유에 대한 설명은 제공되지 않습니다. SunOS 정렬을 위한 Illumos 매뉴얼 페이지에 설명이 제공됩니다.
-n
정렬 키를 선택적 공백 문자, 선택적 빼기 기호, 0개 이상의 숫자, 선택적 기수 문자 및 천 단위 구분 기호(현재 로케일에 정의된 대로)로 구성된 초기 숫자 문자열로 제한합니다. 산술 값으로 정렬되는 구성입니다. 빈 숫자 문자열은 0으로 처리됩니다.앞에 오는 0과 0보다 큰 부호는 정렬에 영향을 주지 않습니다.
이 동작은 SUSv4 및 POSIX.1-2008에도 지정되어 있습니다(http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html), illusmos 매뉴얼 페이지와 동일한 문구를 사용합니다.
-g
GNU 정렬 에는 정수 대신 부동 소수점 숫자를 기준으로 정렬하는 "범용 숫자 정렬" 도 있습니다 . 여기서 빈 숫자 문자열은 0 이전에 정렬됩니다. 이것이 부작용인지 의도적인 것인지 확실하지 않습니다. 그러나 -g
이는 크기가 작기 때문에 주의해야 합니다 -n
. 대규모 데이터 세트를 정렬하거나 사용자가 기다리는 작업을 수행하는 경우에는 피해야 합니다 -g
.
답변2
-g를 사용할 수 있습니다.
-g, --general-numeric-sort 일반 숫자 값에 따라 비교
root@virt01-ubuntu:~# ls | sort -t. -k1g
a.txt
0.txt
1.txt
2.txt
3.txt
root@virt01-ubuntu:~#