다음과 같은 테이블이 있습니다.
'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'|' -