Unix 정렬에서는 필드 구분 기호로 틀에 얽매이지 않는 구분 기호 "±"를 허용하지 않습니다.

Unix 정렬에서는 필드 구분 기호로 틀에 얽매이지 않는 구분 기호 "±"를 허용하지 않습니다.

나는 그들 모두를 시도했다

... | sort -k'1,1r' -k'2,2' -t'±'

... | sort -k'1,1r' -k'2,2' -t$'\xC2\xB1'


*$> sort: ±: Invalid argument*

정렬이 지원되지 않기를 바랍니다. 누락된 이스케이프 처리 또는 특수 문자 처리만 있을 뿐입니다.

내 설정은 다음과 같습니다

localhost:~ user$ locale
LANG=
LC_COLLATE="C"
LC_CTYPE="UTF-8"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=

localhost:~ user$ sort --version
2.3-Apple (99)

답변1

당신이 보면Apple macOS 소스 코드sort, 이를 약간 수정했습니다.FreeBSD의 기원.

특히, 당신은 같은 것을 찾을 것입니다-tFreeBSD와 같은 어색하고 손상된 옵션 처리.

            case 't':
                while (strlen(optarg) > 1) {
                    if (optarg[0] != '\\') {
                        errc(2, EINVAL, "%s", optarg);
                    }
                    optarg += 1;
                    if (*optarg == '0') {
                        *optarg = 0;
                        break;
                    }
                }

보시 -t다시피 매개변수가 비어 있거나(이 경우 NUL이 구분 기호임) 단일 매개변수가 포함된 경우에만 가능합니다.바이트임의 개수의 \문자로 시작하고 그 뒤에 바이트가 오거나(이 경우 바이트가 구분 기호로 사용됨) 0뒤에 아무 것도 나오지 않습니다. 이 경우 구분 기호는 입니다 NUL.

예:

  • -t ''또는 -t '\0', 또는 -t '\\\\\0'또는 -t '\\0whateverNUL 문자로 구분
  • -t '\t', -t '\\\t'경계t
  • -t '\', -t '\\\\\'백슬래시로 구분됩니다.

그럼에도 불구하고 구분 기호는 하나만 사용할 수 있습니다.바이트, 이 신비한 추가 처리가 -t '\0'GNU와의 호환성을 위해 NUL 구분 기호를 지정하는 데 사용될 수도 있습니다 sort(FreeBSD sort는 GNU였습니다 sort).그 약속이는 options 와도 관련이 없으므로 -t구분 기호를 -t '\\'지정하는 데에도 사용할 수 있습니다 (GNU에서 허용하는 것이 아님 ).\sort

따라서 멀티바이트 문자를 구분 기호로 사용할 수 없습니다.

멀티바이트 문자를 허용하는 구현 은 많지 않습니다 sort. GNU나 busybox도 sort마찬가지입니다 . 그러나 ast-open은 sort.

여기서는 ±정렬하기 전에 단일 바이트 문자(가급적이면 정렬에 영향을 주지 않도록 입력에 표시되지 않는 문자)로 교체하고 나중에 복원할 수 있습니다. 고맙게도 FreeBSD tr와 아마도 macOS tr도 멀티바이트 문자(GNU와 반대 tr)를 지원합니다.

<input tr '±\1' '\1±' | sort -t $'\1' ... | tr '±\1' '\1±'

관련 정보