Formatage du texte en colonnes

11

J'ai un fichier avec deux colonnes comme indiqué ci-dessous (exemple):

FICHIER 1:

John 1
Peter 2
Michael Rod 3
Su 7
Louise 9

J'ai besoin de formater cela et ma sortie attendue devrait être:

FICHIER 1:

John        1
Peter       2
Michael Rod 3
Su          7
Louise      9
RAM
la source
1
où sont les 2 colonnes?
marc
Les deux sorties semblent être les mêmes. Pourriez-vous s'il vous plaît donner plus de détails sur votre question?
2
Comment les colonnes sont-elles définies? Y a-t-il un onglet ou un autre caractère entre le nom et le numéro? Comment pouvons-nous savoir qu'il Michael Rod 3s'agit de 2 colonnes et non de 3?
terdon
2
Non, ne postez pas d'images de texte . J'allais juste copier et coller ce texte pour pouvoir vous aider, et maintenant je ne peux plus.
Kusalananda
1
idem ce que mmmint et terdon ont dit; pouvez-vous spécifier, par exemple, que c'est la dernière colonne qui doit être mise en retrait pour permettre la largeur de la ligne la plus longue?
Jeff Schaller

Réponses:

18

Si l'entrée n'avait été que de deux colonnes, j'aurais suggéré d'utiliser column -t. Cela ne fonctionne pas vraiment ici, car l' columnutilitaire traitera n'importe quel nombre d'espaces ou d'onglets comme des délimiteurs de colonne:

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

"Michael Rod" est deux colonnes, de sorte qu'une seule ligne a une colonne de plus que les autres lignes, ce qui gâche la sortie.

Nous pouvons contourner cela en insérant un caractère de tabulation avant la dernière colonne, puis en columnutilisant (uniquement) cela comme délimiteur:

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

Dans Awk, NFcorrespond au nombre de champs (colonnes) et $NFcorrespond aux données du dernier champ. Le script que j'utilise modifie simplement les données du dernier champ en ajoutant un caractère de tabulation avant d'imprimer la ligne complète.

Si votre shell ne comprend pas $'\t', vous pouvez choisir un autre caractère qui ne fait pas partie des données:

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