Formatieren von Text in Spalten

11

Ich habe eine Datei mit zwei Spalten wie unten gezeigt (Beispiel):

DATEI 1:

John 1
Peter 2
Michael Rod 3
Su 7
Louise 9

Ich muss dies formatieren und meine erwartete Ausgabe sollte sein:

DATEI 1:

John        1
Peter       2
Michael Rod 3
Su          7
Louise      9
RAM
quelle
1
Wo sind die 2 Spalten?
Marc
Beide Ausgänge scheinen gleich zu sein. Könnten Sie bitte weitere Details zu Ihrer Frage angeben?
2
Wie sind Spalten definiert? Gibt es einen Tabulator oder ein anderes Zeichen zwischen dem Namen und der Nummer? Wie können wir wissen, dass Michael Rod 3das 2 Spalten und nicht 3 sind?
Terdon
2
Nein, poste keine Textbilder . Ich wollte diesen Text nur kopieren und einfügen, um Ihnen helfen zu können, und jetzt kann ich nicht.
Kusalananda
1
das Gleiche, was mmmint und terdon sagten; Können Sie beispielsweise angeben, dass es die letzte Spalte ist, über die eingerückt werden muss, um die Breite der längsten Zeile zu berücksichtigen?
Jeff Schaller

Antworten:

18

Wenn die Eingabe nur zwei Spalten gewesen wäre, hätte ich vorgeschlagen, zu verwenden column -t. Dies funktioniert hier jedoch nicht ganz, da das columnDienstprogramm eine beliebige Anzahl von Leerzeichen oder Tabulatoren als Spaltenbegrenzer behandelt:

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

"Michael Rod" besteht aus zwei Spalten, sodass eine einzelne Zeile eine Spalte mehr als die anderen Zeilen enthält, was die Ausgabe durcheinander bringt.

Wir können dies umgehen, indem wir vor der letzten Spalte ein Tabulatorzeichen einfügen und dieses dann column(nur) als Trennzeichen verwenden:

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

In Awk NFist die Anzahl der Felder (Spalten) und $NFdie Daten im letzten Feld. Das von mir verwendete Skript ändert einfach die Daten des letzten Felds, indem ein Tabulatorzeichen vorangestellt wird, bevor die gesamte Zeile gedruckt wird.

Wenn Ihre Shell nicht versteht $'\t', können Sie ein anderes Zeichen auswählen, das nicht Teil der Daten ist:

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