!["모든 필드" 사전순으로 정렬](https://linux55.com/image/93640/%22%EB%AA%A8%EB%93%A0%20%ED%95%84%EB%93%9C%22%20%EC%82%AC%EC%A0%84%EC%88%9C%EC%9C%BC%EB%A1%9C%20%EC%A0%95%EB%A0%AC.png)
다음은 요점을 설명하기 위한 매우 간단한(인위적이긴 하지만) 예입니다. /tmp/table
다음 내용이 포함된 파일이 있다고 가정해 보겠습니다 .
px9xc
px12xc
pqx12xc
pqx9xc
여기서 x
역할은필드 구분 기호. 따라서 파일에는 4개의 행과 3개의 열이 있는 테이블이 포함됩니다. (이제부터 이 열을 "필드"라고 부릅니다.)
이 테이블을 필드를 기준으로 사전순으로 정렬하고 싶습니다. 내 말은, 두 행의 필드 1에 동일한 값이 있는 경우 필드 2를 기준으로 정렬하여 동점을 구분하고, 필드 2의 값도 동일하면 필드 3을 기준으로 정렬한다는 것입니다. 1 참고:이내에sort
각 필드에 대해 기본 순서를 가정합니다 .
즉, 의 테이블에 대해 /tmp/table
필요한 정렬은 다음과 같습니다.
px12xc
px9xc
pqx12xc
pqx9xc
sort
( 기본 순서 에서는 가 12
앞에 옵니다 9
.)
필드 구분 기호가 다음과 같이 해석되지 않기 때문에 간단한 호출로 sort
는 원하는 정렬이 생성되지 않습니다.
% sort /tmp/table
pqx12xc
pqx9xc
px12xc
px9xc
또한 원하는 정렬이 생성되지 않습니다.
% sort -tx -k1,3 /tmp/table
pqx12xc
pqx9xc
px12xc
px9xc
sort
(적어도 내 시스템에 설치된 것, 즉 GNU)를 사용하여 원하는 정렬을 달성하기 위해 찾은 유일한 방법은 다음과 같습니다.
% sort -tx -k1,1 -k2,2 -k3,3 /tmp/table
px12xc
px9xc
pqx12xc
pqx9xc
이 솔루션의 문제점(필드 수만큼 많은 옵션을 지정하는 지루함 외에도 -k?,?
)은 필드 수가 다른 테이블로 일반화되지 않는다는 것입니다.
sort
"모든 필드"에 필드 기반 사전 편찬 순서를 적용하는 편리한 방법이 있습니까 ?
1보다 일반적으로 테이블에 다음이 있는 경우질소필드에서 사전순으로 두 행 중 어느 행이 먼저 나오는지 결정하려면 다음 재귀 규칙을 적용하면 됩니다.케이범위는 1부터질소: 두 행 중 필드 1의 값이 동일한 경우케이 - 1이면 다음 값에 따라 동점이 결정됩니다.케이-번째 필드.
답변1
구분 기호를 "네이티브" 정렬이 작동하도록 허용하는 다른 구분 기호(예: NUL 문자)로 속이고 교체한 다음 다시 설정할 수 있습니다.
예를 들어
tr x '\000' < file.txt | sort | tr '\000' x
이제 정렬에 대한 로캘의 영향을 알아야 할 수도 있으므로 다음을 수행할 수 있습니다.
tr x '\000' < file.txt | LANG=C sort | tr '\000' x
이 방법은 데이터에 NUL이 포함되지 않은 경우에만 작동합니다!
서식이 지정된 테이블을 사용하면 이것이 어떻게 작동하는지 더 쉽게 설명할 수 있습니다.
두 행을 비교해야 합니다.
ab | def
abc | def
ab<NUL>def
구분 기호를 NUL 로 설정하고 abc<NUL>def
. <NUL>
앞에 나타나 c
므로 첫 번째 필드를 올바르게 정렬했습니다.
이제 첫 번째 필드가 일치하고 두 번째 필드가 다르다고 가정합니다.
abc | def
abc | ghi
abc<NUL>def
이제 비교해 보겠습니다 abc<NUL>ghi
. 첫 번째 필드 및 구분 기호와 일치하는 항목을 찾았으며 이제 두 번째 필드를 정렬하는 중입니다.