Formatando texto em colunas

11

Eu tenho um arquivo com duas colunas, como mostrado abaixo (exemplo):

ARQUIVO 1:

John 1
Peter 2
Michael Rod 3
Su 7
Louise 9

Preciso formatar isso e minha saída esperada deve ser:

ARQUIVO 1:

John        1
Peter       2
Michael Rod 3
Su          7
Louise      9
RAM
fonte
1
onde estão as 2 colunas?
marc
Ambas as saídas parecem ser as mesmas. Poderia dar mais detalhes sobre sua pergunta?
2
Como as colunas são definidas? Existe uma guia ou outro caractere entre o nome e o número? Como podemos saber que Michael Rod 3são 2 colunas e não 3?
terdon
2
Não, não poste imagens de texto . Eu estava apenas copiando e colando esse texto para poder ajudá-lo, e agora não posso.
Kusalananda
1
o mesmo que mmmint e terdon disseram; você pode especificar, por exemplo, que é a última coluna que precisa ser recuada para permitir a largura da linha mais longa?
Jeff Schaller

Respostas:

18

Se a entrada tivesse sido apenas duas colunas, eu teria sugerido o uso column -t. Porém, isso não funciona aqui, pois o columnutilitário tratará qualquer número de espaços ou guias como delimitadores de coluna:

$ column -t file1
John     1      
Peter    2      
Michael  Rod  3 
Su       7      
Louise   9      

"Michael Rod" é duas colunas, de modo que uma única linha tem uma coluna a mais que as outras linhas, o que atrapalha a saída.

Podemos contornar isso, inserindo um caractere de tabulação antes da última coluna e, em seguida, vamos columnusar (apenas) isso como um delimitador:

$ awk '{ $NF = "\t" $NF; print }' file1 | column -t -s $'\t'
John          1
Peter         2
Michael Rod   3
Su            7
Louise        9

No Awk, NFé o número de campos (colunas) e $NFos dados no último campo. O script que estou usando simplesmente modifica os dados do último campo, acrescentando um caractere de tabulação antes de imprimir a linha completa.

Se seu shell não entender $'\t', você poderá escolher outro caractere que não faça parte dos dados:

awk '{ $NF = "@" $NF; print }' file1 | column -t -s '@'
John          1
Peter         2
Michael Rod   3
Su            7
Louise        9
Kusalananda
fonte