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