Formatowanie tekstu w kolumny


11

Mam plik z dwiema kolumnami, jak pokazano poniżej (przykład):

PLIK 1:

John 1
Peter 2
Michael Rod 3
Su 7
Louise 9

Muszę sformatować to, a moim oczekiwanym wynikiem powinno być:

PLIK 1:

John        1
Peter       2
Michael Rod 3
Su          7
Louise      9

1
gdzie są 2 kolumny?
marc

Oba wyjścia wydają się takie same. Czy możesz podać więcej szczegółów na swoje pytanie?

2
Jak definiowane są kolumny? Czy między nazwą a numerem jest tabulator lub inny znak? Skąd możemy wiedzieć, że Michael Rod 3są to 2 kolumny, a nie 3?
terdon

2
Nie, nie publikuj obrazów tekstu . Chciałem tylko skopiować i wkleić ten tekst, aby móc ci pomóc, a teraz nie mogę.
Kusalananda

1
to samo, co powiedzieli mmmint i terdon; czy możesz na przykład określić, że jest to ostatnia kolumna, która wymaga wcięcia, aby umożliwić szerokość najdłuższej linii?
Jeff Schaller

Odpowiedzi:


18

Gdyby dane wejściowe obejmowały tylko dwie kolumny, sugerowałbym użycie column -t. To jednak nie działa tutaj, ponieważ columnnarzędzie będzie traktować dowolną liczbę spacji lub tabulatorów jako ograniczniki kolumn:

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

„Michael Rod” to dwie kolumny, więc jeden wiersz ma jedną kolumnę więcej niż inne wiersze, co zakłóca wynik.

Możemy obejść ten problem, wstawiając znak tabulacji przed ostatnią kolumną, a następnie pozwalając na columnużycie (tylko) tego znaku jako separatora:

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

W Awk NFjest liczbą pól (kolumn) i $NFdanymi w ostatnim polu. Skrypt, którego używam, po prostu modyfikuje dane ostatniego pola, przygotowując znak tabulacji przed wydrukowaniem pełnego wiersza.

Jeśli twoja powłoka nie rozumie $'\t', możesz wybrać inny znak, który nie jest częścią danych:

awk '{ $NF = "@" $NF; print }' file1 | column -t -s '@'
John          1
Peter         2
Michael Rod   3
Su            7
Louise        9
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.