Defina o alinhamento de colunas numéricas ao colocar dados em coluna

4

Eu uso column -t para formatar dados para fácil visualização no shell, mas parece não haver nenhuma opção para especificar o alinhamento da coluna (por exemplo, alinhar à direita).

Qualquer Bash one-liners para fazer isso? Eu tenho um número arbitrário de colunas.

    
por Alex B 12.12.2011 / 04:45

2 respostas

2

UPDATE: adicionado um script (não um forro, no entanto), que permite que você escolha quais colunas você deseja justificado ... Ele serve para esquerda (padrão) e direita (não Center) .. Como é, ele espera Campos delimitados por TAB. Você pode alterar o separador de saída da coluna via $ 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/$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/g; s/$Q/$S/g; s/Z$//"

Saída típica:

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

Nota: column não funciona como você poderia esperar quando você tem células vazias.

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.

A partir daqui, é a resposta original que está relacionada, mas não aborda especificamente a questão principal da questão.

Aqui está o "one-liner" que se ajusta a números inteiros (e permite sinais +/-). O "X" posiciona o column no bloco direito da última célula.

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

Saída típica

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

Se você tiver valores float, ou floats misturados com inteiros, ou apenas inteiros, (sinais opcionais de +/-), um pouco mais de shuffling funciona.

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

Saída típica

+1255       789   0.11   -55           34
  -15.9900   33   0.22  +321.987  2323566
    
por 12.12.2011 / 07:39
2

De um ponto simples, eu usaria 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}'

Isso faz um pouco mais amplo

    
por 12.12.2011 / 06:04