컬럼-t에 해당하는 POSIX

컬럼-t에 해당하는 POSIX

나는 최근에 POSIX가 있다는 사실에 놀랐습니다. 목록 유틸리티는 포함되어 있지 않습니다. column 유용. column4.3BSD에서 처음 등장했으며 매우 유용합니다. POSIX와 동등한 것이 있습니까?


내가 바꾸고 싶은 정확한 명령은 다음과 같습니다.

$ 더보기 -- ./tmp.txt
1 작은 000a
2 매우_매우_매우_매우_긴000b
소형 000c 3개
$column-t --./tmp.txt
1 작은 000a
2 매우_매우_매우_매우_긴000b
소형 000c 3개
$

즉, 탭을 확장하여 더 예쁜 열을 만들 수 있습니다.

답변1

POSIX는 기존 동작을 인코딩하는 것을 선호하며 기존 동작이 만족스럽지 않을 때 널리 채택되지 않는 새로운 기능만 적용합니다. 요즘에는 데이터를 표시하기 위해 고정 너비 글꼴의 서식 없는 텍스트를 사용하는 데 대한 요구 사항이 많지 않으므로 column요구 사항이 될 가능성은 거의 없습니다. BSD에서 파생된 BSD 와 달리 prSystem V 및 기타 역사적 유니스에는 존재하지 않으므로 상속이 없습니다.

다른 텍스트 유틸리티와 마찬가지로 적절한 작업량을 사용하여 awk로 표현할 수 있습니다. 이것은 최소한으로 테스트되었습니다 column -t. 간단한 경우(단지 한 문자) awk의 옵션은 -Fs와 유사합니다.column-s

#!/usr/bin/env awk
{
    if (max_column < NF) max_column = NF;
    for (i = 1; i <= NF; i++) {
        if (width[i] < length($i)) width[i] = length($i);
        data[NR, i] = $i;
    }
}
END {
    for (i = 1; i < max_column; i++) format[i] = sprintf("%%-%ds  ", width[i]);
    format[max_column] = "%s\n";
    for (k = 1; k <= NR; k++) {
        for (i = 1; i <= max_column; i++) printf format[i], data[k, i];
    }
}

답변2

pr많은 일을 했습니다 column. 실제 명령줄을 지정하면 대체 명령줄을 사용할 수 있습니다.

namepr - 인쇄용 텍스트 파일 변환

요약[옵션]...[파일]...

인쇄를 위해 문서를 페이지나 열로 분할하는 방법을 설명합니다.

특정 경우에는 다음을 사용할 수 있습니다 awk.

awk '{printf("%2s %30s %10s", $1, $2, $3);}' file.txt

너비 지정자 2, 30 및 10은 하드코딩되어 있으므로 입력한 값을 선택하거나 파일을 두 번 읽어야 합니다(한 번은 각 열의 최대 너비를 얻고 두 번째는 입력한 값)을 얻으려면 ).

답변3

column내가 아는 한 POSIX 유틸리티 세트에는 직접적으로 동등한 것이 없습니다.

가능한 (저렴한) POSIX 솔루션은 다음과 같습니다.

$ tr -s ' ' '\n' <<"EOT" | pr -3 -a -t
1   SMALL   000a
2   VERY_VERY_VERY_VERY_LONG    000b
3   SMALL   000c
EOT
1                       SMALL                   000a
2                       VERY_VERY_VERY_VERY_LON 000b
3                       SMALL                   000

복사/붙여넣기 후 샘플 데이터에는 공백으로 구분된 필드가 있습니다. 실제로 개별적으로 분리된 경우에는 TAB를 사용할 수 있습니다 tr '\t' '\n'.

물론 이는 모든 입력 행에 동일한 수의 필드가 있다고 가정합니다. 매우 명백한 단점은 열의 크기가 균일하여 눈에 띄게 열악해 보인다는 것입니다 column -t.

또한 위의 예에 표시된 것처럼 pr행에 고정 길이(기본값은 72자)를 사용하고 열 너비에 맞지 않는 필드를 자릅니다. 그런 다음 -w페이지 너비( )를 적절한 값으로 명시적으로 설정해야 할 수도 있습니다 .

관련 정보