Dividir uma linha em colunas com algumas das colunas justificadas à direita?

5

Existe uma maneira fácil de dividir linhas de texto delimitadas por vírgula em colunas com algumas das colunas justificadas à direita?

Como bônus, seria bom formatar números, mas isso provavelmente não é muito difícil com sed.

    
por jonderry 22.04.2011 / 23:53

3 respostas

6

Awk e o formato %42s printf vem à mente. Aqui está um script simples para você começar. Configurar width[i] para um valor positivo na cláusula BEGIN faz com que a coluna tenha a largura especificada, alinhada à esquerda. Se width[i] for negativo, a coluna i será alinhada à direita e terá a largura -width[i] . Esse script não manipula os campos amplos de maneira inteligente, todas as colunas subseqüentes são deslocadas diretamente para essa linha.

awk -F, -vOFS= '
BEGIN {width[1]=-10; width[2]=8;}
{ for (i=1; i<=NF; i++) {$i = sprintf("%*s", width[i], $i)}
  print }'

Se você tiver campos numéricos, poderá usar outros formatos printf .

Se você tem o utilitário BSD column (o Debian envia , Eu não sei sobre outras distribuições Linux), você pode facilmente formatar coisas em colunas com column -t -s , . O bom sobre column é que ele determina a largura da coluna automaticamente. No entanto, não faz formatação à direita; enquanto você pode obtê-lo com algum pós-processamento, não sei se a complexidade vale a pena.

Você pode fazer tudo em Perl. O seu formato formato pode ajudar.

Uma abordagem mais poderosa para a formatação de tabelas com ferramentas comuns do Unix é o tbl , que é a parte do * roff (o man page formatter) que manipula tabelas. Mas isso também é mais complexo porque você precisa converter a entrada para roff.

Outra ferramenta possível é o w3m , que é bom na renderização de tabelas. Aqui, você teria que converter a entrada em HTML.

    
por 23.04.2011 / 01:05
5

Acabou descobrindo isso sozinho. Em vez de column , use awk para produzir colunas. Por exemplo, se foo.txt tiver linhas no formato "bar, 36,17.34566", você poderá fazer algo como

cat foo.txt | awk -F, '{printf "%-20s %20d %20.2f\n", $1, $2, $3 }'

para produzir colunas de largura 20, com a primeira coluna justificada à esquerda, as outras duas colunas justificadas à direita e a última coluna com duas casas decimais de precisão.

    
por 23.04.2011 / 01:10
0

Meu canal:

| nl -nrz\
| rev\
| column -t\
| rev\
| cut -d' ' -f2-
  1. adicionar coluna de prefixo de largura fixa
  2. inverter caracteres na string
  3. colunas alinhadas à esquerda
  4. inverter caracteres na string
  5. remova a coluna adicionada em # 1
por 30.06.2016 / 15:46