"모든 필드" 사전순으로 정렬

"모든 필드" 사전순으로 정렬

다음은 요점을 설명하기 위한 매우 간단한(인위적이긴 하지만) 예입니다. /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. 첫 번째 필드 및 구분 기호와 일치하는 항목을 찾았으며 이제 두 번째 필드를 정렬하는 중입니다.

관련 정보