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)은 이 가정을 해야 합니다.


하나의 독립형 도구를 사용하는 것이 아니라 를 사용하면 tr가능 sort합니다 paste. 파이프라인에 한 번에 하나의 명령을 추가하여 변환이 어떻게 진행되는지 확인할 수 있습니다.

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

관련 정보