이 명령을 사용하고 있습니다
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
당신이 원하는 것이 아닌가요?
나는 당신이 ex
and 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 및 또는 로케일을 제외한 대부분의 로케일에서 작동함).C
POSIX
$ 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
.