Bash에서 개행이 아닌 레코드 구분 기호를 사용하여 테이블 정렬

Bash에서 개행이 아닌 레코드 구분 기호를 사용하여 테이블 정렬

다음과 같은 테이블이 있습니다.

'a;b;f|d;e;c|g;h'

세 번째 열을 기준으로 정렬하고 싶습니다. 출력은 다음과 같아야합니다.

'g;h|d;e;c|a;b;f'

whitespace표준 구분 기호 를 사용하려면 newline다음을 사용하여 수행할 수 있습니다 sort.

printf '%b' 'a b f\nd e c\ng h' | sort -k 3

출력됩니다

g h
d e c
a b f

명령은 sort다음 옵션을 사용하여 비표준 필드 구분 기호를 채택할 수도 있습니다 -t.

printf '%b' "a;b;f\nd;e;c\ng;h" | sort -k 3 -t ';'

출력됩니다

g;h
d;e;c
a;b;f

newline그러나 레코드가 아닌 구분 기호를 사용하여 테이블을 정렬하는 방법을 찾지 못했습니다 .

이것이 달성될 수 있습니까? 그렇다면 어떻게 해야 할까요?

편집하다

핵심 조건은 프로세스 중에 데이터나 구분 기호가 변경되지 않고 표시되는 순서만 변경된다는 것입니다.

명령 외에 다른 도구 sort도 사용할 수 있습니다. POSIX 준수가 선호되지만 필수는 아닙니다.

답변1

sort 명령은 매뉴얼에 표시된 대로 개행 또는 NUL 문자로 구분된 입력 레코드만 정렬할 수 있습니다.

정렬 유틸리티는 텍스트와 바이너리 파일을 줄별로 정렬합니다. 행은 개행(기본값) 또는 NUL '\0' 문자로 후속 레코드와 구분된 레코드입니다.

|따라서 원하는 결과를 얻으려면 어느 시점에서 변환할 때 레코드 구분 기호(귀하의 경우)에 대한 지식이 필요합니다 . 다른 명령(Awk/Perl 또는 datamash)은 이 가정을 해야 합니다.


단일 독립 실행형 도구를 사용하는 대신 이를 수행 trsort수 있습니다 paste. 파이프라인에 한 번에 하나의 명령을 추가하면 변환이 어떻게 진행되고 있는지 확인할 수 있습니다.

echo 'a;b;f|d;e;c|g;h' | tr '|' '\n' | sort -t';' -k3,3 | paste -sd'|' -

관련 정보