alinhar as colunas à direita

3

Para o shell de comando, existe um programa comum como column que tem uma opção para alinhar colunas específicas ou todas as colunas à direita, se não também detectar campos numéricos e fazê-lo automaticamente para aqueles?

Caso contrário, qual pode ser a maneira mais concisa com os comandos de processamento de texto?

Exemplo de entrada delimitada por espaço já canalizada por | column -t :

TVN         20120419  10.08  10.08  9.15   9.6    1630000  9.17    20120419  4.6      83.88   7376600    -0.21858
INTEGERPL   20120419  143.1  148.9  140.3  142.5  2910     138.53  20120405  4.32503  5.55    1642500    1.26158
JSW         20120419  93.55  94.4   91.25  92.7   116000   90.07   20120329  3.86997  8.54    13155770   1.29315
KERNEL      20120419  73.7   74.9   72.9   74.1   56200    71.8    20120404  3.48432  10.71   2819790    1.50892
EUROCASH    20120419  39.49  41.99  39.01  40.73  812000   38.05   20120328  4.85095  20.21   5280548    2.46091
PEKAO       20120419  145.9  147.8  144.0  145.5  292000   140.2   20120404  3.70615  5.48    68858748   2.63889
PKNORLEN    20120419  38.0   38.5   37.25  37.35  1230000  36.26   20120329  4.15476  21.21   104607200  2.65772

Observe problemas de legibilidade esp. onde as diferenças entre os registros são de várias magnitudes (como a segunda última coluna). Aliás, a formatação de preços para mostrar sempre N casas decimais é um problema por si só. Mas eu usei o OFMT="%.4f" do awk para isso.

    
por Marcos 19.04.2012 / 15:50

2 respostas

3

Alinhamento e detecção de campo numérico podem ser obtidos pelo seguinte programa simples awk .

{
    width=10;
    separator="|";

    for (i=1; i<=NF; i++) {
        if (match($i, /[-+]*[0-9]+[\.]*[0-9]*/)) {
            printf("%"width"s", $i);
        }
        else { 
            printf("%-"width"s", $i);
        }
        if (i == NF) printf("\n");
        else printf("%s", separator);
    }
}

Salve como column.awk .

Para testar como funciona, tente o seguinte:

echo "abc -1.2 def 2 3 hij" | awk -f column.awk

A saída é:

abc       |      -1.2|def       |         2|         3|hij

Existem dois parâmetros ajustáveis dentro do script .awk :

  • width: o campo padrão com (usado para alinhamento)
  • separador: usado para separar colunas de saída
por lgarzo 19.04.2012 / 16:44
0

awk 's printf deve ser capaz de fazer isso. Para detalhes, você deve fornecer mais informações sobre a entrada e o formato de saída (desejado).

    
por tohuwawohu 19.04.2012 / 16:15