구분 기호 정렬: 중괄호 및 대괄호

구분 기호 정렬: 중괄호 및 대괄호

이 명령을 사용하고 있습니다

cat acronyms.tex | sort -t{ -k1

다음과 같이 문자열 형식으로 파일을 정렬합니다.

\newacronym{ex}{EX}{Expanded}

첫 번째 중괄호 쌍의 내용을 기준으로 정렬하고 싶습니다. 그러나 일부 라인은 다음과 같습니다.

\newacronym[a string]{ex2}{EX2}

내가 사용하고 있는 명령은 두 번째 문자열이 첫 번째 문자열 앞에 온다라는 점에서 합계와 결과를 {구별 할 수 없습니다.[

[와 를 어떻게 구별할 수 있나요 {?

답변1

어떤 이유로든 정렬해야 하는 경우오직첫 번째 중괄호 쌍의 내용을 다루는 가장 쉬운 방법은 아마도 다음을 사용하는 것입니다.장식-정렬-취소 장식 모드. 나는 사용하고 싶다sed그리고cut, 그러나 셸에서 이 기능을 구현하는 데는 여러 가지 옵션이 있습니다.

sed -e 's/^\([^{]*{\([^}]*\)}\)/\2 \1/' < data|sort|cut -d' ' -f2-

sed명령은까지 모든 것첫 번째 교정기 쌍중괄호, 공백 및 원래 문자열의 내용을 포함합니다. 평소대로 정렬할 수 있습니다. 그런 다음 cut처음에 추가한 필드를 다시 설정했습니다.

이것은 홀수 문자와 키의 고르지 않은 길이를 잘 처리하지만 공백이 문제가 되고 이스케이프 \}도 문제가 됩니다. 필요한 경우 다른 구분 기호를 사용하십시오.


데이터가 다음과 같은 경우:

\newacronym{A}{EX}{Expanded}
\newacronym{F}{EX}{Expanded}
\newacronym{D}{EX}{Expanded}
\newacronym{C}{EX}{Expanded}
\newacronym[abc]{B}{EX}{Expanded}
\newacronym{CD}{EX}{Expanded}
\newacronym[def]{E}{EX}{Expanded}

그런 다음 sed명령의 결과는 다음과 같습니다.

A \newacronym{A}{EX}{Expanded}
F \newacronym{F}{EX}{Expanded}
D \newacronym{D}{EX}{Expanded}
C \newacronym{C}{EX}{Expanded}
B \newacronym[abc]{B}{EX}{Expanded}
CD \newacronym{CD}{EX}{Expanded}
E \newacronym[def]{E}{EX}{Expanded}

나머지는 간단합니다.

답변2

를 사용하면 전체 행이 정렬 키로 사용 -k1됩니다 . sort당신이 원하는 것이 아닌가요?

나는 당신이 exand ex2(에 있는 것과 같이 {...})를 키로 사용하고 싶다고 가정합니다. 이렇게 하려면 -k2정렬 필드로 지정하세요.

이것은 첫 번째 이후의 모든 것을 선택하여 {키로 사용합니다.

\newacronym{ex}{EX}{Expanded}
^^^^^^^^^^^ ^^^ ^^^ ^^^^^^^^^
field 1     f2  f3  field 4

\newacronym[a string]{ex2}{EX2}
^^^^^^^^^^^^^^^^^^^^^ ^^^^ ^^^^
field 1               f2   f3

도착하다오직행의 나머지 부분 대신 두 번째 필드를 키로 사용하려면 를 사용합니다 -k2,2.

시험:

$ sort -t '{' -k2,2 file
\newacronym[a string]{ex2}{EX2}
\newacronym{ex}{EX}{Expanded}

줄이 여전히 잘못된 순서로 나타납니다. 이는 ex2}정렬이 앞에 있기 때문입니다 ex}(ASCII 테이블에서 }POSIX 로케일을 사용하고 있음).2

다시 시도하십시오. 하지만 이번에는 Ubuntu에서 로케일을 사용하여 실행하십시오( en_US.UTF-8모든 glibc Linux 및 또는 로케일을 제외한 대부분의 로케일에서 작동함).CPOSIX

$ LC_COLLATE="en_US.UTF-8" sort -t '{' -k2,2 file
\newacronym{ex}{EX}{Expanded}
\newacronym[a string]{ex2}{EX2}

로케일에 따라 이 LC_COLLATE=...비트를 추가할 수도 있고 추가하지 않을 수도 있습니다.


이는 sort쉘 독립적 bash유틸리티이며 쉘에 관계없이 동일한 방식으로 작동합니다. 따라서 이는 " bash정렬" 문제 가 아닙니다 sort.

관련 정보