Estou editando uma tabela simples. Eu gostaria de tê-lo bem formatado. Embora eu possa usar tbl
, latex
ou similar, isso parece exagero - o texto simples é realmente suficiente. Como é simples, é melhor que a fonte seja a saída. Portanto, a fonte também deve parecer boa. Parece que deve ser um trabalho perfeito para column -s '|' -t
- ele encontra os separadores e insere espaços automaticamente para alinhar de acordo com a largura máxima em cada coluna. Infelizmente, ele exclui os separadores, por isso não posso executá-lo novamente depois de uma nova edição. Existe alguma boa ferramenta de processamento de texto que possa fazer isso idempotentemente, para que sua saída sirva de entrada? Ou preciso escrever o meu?
EDIT: aqui está um exemplo do que eu quero:
foo | bar | baz
abc def | 12 | 23456
Deve se tornar
foo | bar | baz
abc def | 12 | 3456
Quando ' '
é o separador e o espaçador, column -t
funciona bem. Mas meus itens têm espaços, então não posso usar isso. Ter os espaçadores distintos dos separadores complica as coisas. Eu acho que é útil tê-los tratados como caracteres separadores quando próximos a separadores, mas não é isso que column -s '|' -t
acontece (embora obviamente o comportamento atual também seja útil).
fonte
printf
holocausto de cada vez, que eu encontrei até agora, é adicionar um caractere (como@
) exclusivo aos dados e usá-lo... | column -s@ -t
posteriormente.Respostas:
Não sei se entendi direito qual é o seu problema. Mas, pode ser resolvido adicionando um separador temporal adicional? portanto, você pode usar o segundo separador para marcar as separações, mantendo o separador original intocado.
Veja este exemplo em que adiciono um "@" a cada um dos "|" portanto, a entrada do comando da coluna seria "xxx @ | aaaa". A coluna processará o "@" mantendo o "|" intocado:
fonte
sed 's/ *| */@| /g'
vezsed 's/ |/|/g'
após ascolumn
correções os espaços extras adicionados. Agora temos uma solução que funciona bem o suficiente para mim. (Apesar de que seria bom se não depender de um caractere extra assim que se um não está disponível.?)Isso não estava disponível quando você fez a pergunta, mas a partir da versão 2.23
column
deutil-linux
permite selecionar o separador de saída viaEntão, basta executar:
fonte
util-linux
versão não está disponível no Ubuntu 18.04 (e provavelmente em outras distros derivadas de Debain) no momento em que este foi escrito. Somente absdmainutils
versão está disponível. Absdmainutils
versão não suporta a formatação de saída.Aqui está um script bash. Ele não usa 'column -t', e o separador é tratado exatamente como o IFS, porque é o IFS (ou pelo menos a versão interna do IFS do awk) ... O delimitador padrão é $ '\ t'
Este script preenche totalmente o campo mais à direita.
'column' não faz isso.
Ao preencher todas as colunas, esse script pode ser
facilmente modificado para criar também um quadro de tabela.
Nota. O arquivo de entrada precisa ser processado duas vezes
('coluna' também precisaria fazer isso).
A primeira passagem é obter as larguras máximas da coluna.
A segunda passagem é expandir os campos (por coluna)
Adicionadas algumas opções e corrigido um erro gritante (renomeando variáveis :(
fonte
Dê uma olhada no plugin vim chamado Tabularize
fonte
Este é um ajuste de duas passagens na resposta de hmontoliu , que evita a necessidade de codificar o delimitador, adivinhando-o a partir dos dados de entrada.
$d
.@
, conforme o comentário de PeterO .O código é uma função que aceita um nome de arquivo, ou então entrada de STDIN :
Saída de
algn foo
(ou tambémalgn < foo
):fonte
Idéia usada do hmontoliu para implementar o comando simples:
Comente:
${1:-,}
- é o primeiro argumento com,
como padrãosed
insere um símbolo intermediário ($interm
segundo argumento ou~
por padrão)column
substitui símbolo intermediário com espaços que fazem alinhamentosed
limpa os espaços redundantes após ocolumn
comandoExemplo de uso:
Também é bom porque é idempotente: você pode aplicá-lo várias vezes e obter o mesmo resultado (por exemplo, quando você edita no vim e realinhar).
fonte