열 데이터 설정 시 숫자 열 정렬

열 데이터 설정 시 숫자 열 정렬

나는 사용한다column -t데이터는 셸에서 쉽게 볼 수 있도록 형식이 지정되어 있지만 열 정렬(예: 오른쪽 정렬)을 지정하는 옵션은 없는 것 같습니다.

이를 수행할 수 있는 Bash Quip이 있습니까? 나는 많은 수의 열을 가지고 있습니다.

답변1

최신 버전에는 column있는 것 같습니다.오른쪽 정렬 옵션일부 열:

   -R, --table-right columns
          Right align text in the specified columns.

예:

$ echo -e "a 1 2\nb 12345 678.90" | column -t -R 2,3
a      1       2
b  12345  678.90

항상 그렇듯이 RHEL/Centos는 절망적으로 오래되었으며 util-linuxRHEL/Centos 7 또는 8에서는 이 옵션을 아직 사용할 수 없습니다(패키지).

답변2

간단한 관점에서 나는awk

column -t filename | awk '{for (i=0; i<NF; i++){l=index($0, $i)+1;printf "%*s ", index($0, $(i+1))-l, $i}printf "%*s\n", index($0, $NF)-l, $NF}'

이렇게 하면 조금 더 넓어집니다

답변3

업데이트: 정렬할 열을 선택할 수 있는 스크립트(한 줄은 아님)를 추가했습니다. 왼쪽(기본값)과 오른쪽(가운데 아님)에 맞습니다. 있는 그대로 탭으로 구분된 필드가 필요합니다. 열 출력 구분 기호를 다음과 같이 변경할 수 있습니다.$S.

RJustCol=(2 3 5)  # Set columns to be right justified.
RJustRex=; Q=$'\x01'; R=$'\x02'; S=" | "
for r in ${RJustCol[@]} ;do  # Build the Right-justify regex.
  RJustRex="${RJustRex}s/^(([^\t]+\t){$((r-1))})([^\t]+)\t/\1\3$R\t/; "
done
sed -r "s/$/\tZ/g; s/^/$Q/; s/\t/\t$Q/g; $RJustRex" file |
  column -t -s $'\t' | 
    sed -r "s/  $Q/$Q/g; s/$Q([^$Q$R]*)$R([^$Q]*)/$S\2\1/g; s/$Q/$S/g; s/Z$//"

일반적인 출력:

| The Lost Art       |   +1255 |  789 | Los                 |     -55 | 
| of the Idle Moment | -159900 | 0123 | Fabulosos Cadillacs | +321987 | 

참고: column셀이 비어 있으면 예상대로 작동하지 않습니다.

Option -n
        By default, the column command will merge multiple adjacent
        delimiters into a single delimiter when using the --t option;
        this option disables that behavior. This option is a Debian
        GNU/Linux extension.

여기에서 시작하는 것은 질문과 관련이 있지만 질문의 주요 문제를 구체적으로 다루지는 않는 원래 답변입니다.

이것은 정수에 맞는 (그리고 +/- 기호를 허용하는) "라인"입니다. "X" 자리 표시자는 column마지막 셀을 올바르게 채우도록 합니다.

sed 's/$/\tX/g' file |column -t |sed -r 's/([-+]?[0-9.]+)( +)/\2\1/g; s/^  //; s/X$//'

일반적인 출력

  +1255  789  011      -55       34
-159900   33  022  +321987  2323566

부동 소수점 값, 정수와 혼합된 부동 소수점 또는 정수(선택적 선행 +/- 기호)가 있는 경우 더 많은 순서 섞기를 수행할 수 있습니다.

sed -r 's/$/\tX/; 
        s/([-+]?[0-9]+\.[0-9]+)\t/\1@\t/g
        s/([-+]?[0-9]+)\t/\1.@\t/g
        s/\./\t./g' file |
  column -t |
    sed -r 's/  \././g
            s/([-+]?[0-9.]+)( +)/\2\1/g
            s/\.@/ /g
            s/@//g
            s/ +X$//'

일반적인 출력

+1255       789   0.11   -55           34
  -15.9900   33   0.22  +321.987  2323566

관련 정보