Edytuję prosty stół. Chciałbym mieć to ładnie sformatowane. Chociaż mogę użyć tbl
, latex
lub podobnego, wydaje się to przesadą - zwykły tekst jest naprawdę wystarczający. Ponieważ jest to proste, równie dobrze mogę mieć źródło jako wynik. Więc źródło też powinno dobrze wyglądać. Wydaje się, że powinno to być idealne zadanie column -s '|' -t
- znajduje separatory i automatycznie wstawia spacje, aby wyrównać je zgodnie z maksymalną szerokością w każdej kolumnie. Niestety usuwa separatory, więc nie mogę go ponownie uruchomić po dalszej edycji. Czy jest jakieś dobre narzędzie do przetwarzania tekstu, które potrafi to robić idempotentnie, aby jego dane wyjściowe służyły jako dane wejściowe? Czy też muszę pisać własne?
EDYCJA: oto przykład tego, czego chcę:
foo | bar | baz
abc def | 12 | 23456
powinno stać się
foo | bar | baz
abc def | 12 | 3456
Kiedy ' '
jest zarówno separatorem, jak i przekładką, column -t
działa dobrze. Ale w moich przedmiotach są spacje, więc nie mogę tego użyć. Oddzielenie elementów dystansowych od separatorów komplikuje sprawę. Myślę, że warto traktować je jako znaki oddzielające obok separatorów, ale to nie column -s '|' -t
tak (choć oczywiście obecne zachowanie jest również przydatne).
źródło
printf
holokaustu za każdym razem, które do tej pory znalazłem, jest dodanie do danych unikalnego char (podobnego@
), a... | column -s@ -t
następnie użycie .Odpowiedzi:
Nie jestem pewien, czy dobrze rozumiem, na czym polega twój problem. Ale czy można to rozwiązać, dodając dodatkowy separator czasowy? dlatego możesz użyć drugiego separatora do oznaczenia separacji, nie zmieniając oryginalnego separatora.
Zobacz ten przykład, w którym dodaję „@” do każdego z „|” więc wejście polecenia kolumny brzmiałoby „xxx @ | rrrr”. Kolumna przetworzy „@” zachowując „|” nietknięty:
źródło
sed 's/ *| */@| /g'
zamiastsed 's/ |/|/g'
pocolumn
poprawkach dodanych dodatkowych spacji. Mamy teraz rozwiązanie, które działa dla mnie wystarczająco dobrze. (Choć byłoby miło, gdyby nie zależało to od takiej dodatkowej postaci. Co, jeśli nie jest dostępna?)To nie było dostępne, gdy zadałeś pytanie, ale od wersji 2.23
column
odutil-linux
pozwala wybrać separator wyjściowy za pośrednictwemWięc po prostu uruchom:
źródło
util-linux
wersja nie jest dostępna w systemie Ubuntu 18.04 (i prawdopodobnie w innych dystrybucjach pochodzących z Debain) w momencie pisania.bsdmainutils
Dostępna jest tylko wersja.bsdmainutils
Wersja nie obsługuje formatowanie wyjścia.Oto skrypt bash. Nie używa „kolumny -t”, a separator jest obsługiwany dokładnie tak, jak IFS, ponieważ jest to IFS (lub przynajmniej wewnętrzna wersja IFS awk) ... Domyślnym ogranicznikiem jest $ '\ t'
Ten skrypt całkowicie wypełnia skrajnie prawe pole.
„kolumna” tego nie robi.
Wypełniając wszystkie kolumny, skrypt ten można
łatwo zmodyfikować, aby również utworzyć ramkę tabeli.
Uwaga. Plik wejściowy musi zostać przetworzony dwukrotnie
(„kolumna” również musiałaby to zrobić)
. Pierwsze przejście to uzyskanie maksymalnej szerokości kolumny.
Drugim krokiem jest rozwinięcie pól (na kolumnę)
Dodano kilka opcji i naprawiono rażący błąd (zmiana nazw zmiennych :(
źródło
Spójrz na wtyczkę vima o nazwie Tabularize
źródło
Jest to dwuprzebiegowe ulepszenie odpowiedzi hmontoliu , która pozwala uniknąć konieczności sztywnego kodowania separatora poprzez odgadywanie go na podstawie danych wejściowych.
$d
.@
, zgodnie z komentarzem PeterO .Kod jest funkcją, która akceptuje nazwę pliku lub dane wejściowe z STDIN :
Wyjście
algn foo
(lub teżalgn < foo
):źródło
Użyto pomysłu hmontoliu do wdrożenia prostej komendy:
Komentarz:
${1:-,}
- jest pierwszym argumentem z,
domyślniesed
wstawia symbol pośredni ($interm
drugi argument lub~
domyślnie)column
zastępuje symbol pośredni spacjami, które wyrównująsed
czyści zbędne spacje pocolumn
rozkaziePrzykład użycia:
Jest również dobry, ponieważ jest idempotentny: możesz zastosować go kilka razy i uzyskać ten sam rezultat (na przykład podczas edycji w vimie i wyrównywania).
źródło