Czy istnieje polecenie lub zestaw poleceń, których można użyć do wyrównania linii tekstu w poziomie do dowolnego znaku? Na przykład z listą adresów e-mail dane wyjściowe utworzyłyby plik tekstowy ze wszystkimi znakami „@” ustawionymi pionowo.
Aby odnieść sukces, uważam, że na początku większości wierszy należy dodać zmienną liczbę pustych spacji. Nie chcę osobnych kolumn, ponieważ czytają więcej wysiłku (na przykład column -t -s "@" < file.txt
).
Przed:
[email protected]
[email protected]
[email protected]
Po:
[email protected]
[email protected]
[email protected]
Innymi słowy: czy mogę określić znak, który ma być punktem kontrolnym, wokół którego otaczający tekst jest wyśrodkowany w poziomie? Mój przypadek użycia to adresy e-mail, aby ułatwić ich skanowanie wizualne.
text-processing
command-line
Tom Brossman
źródło
źródło
@
symboli?@
symboli nie powinno stanowić problemu z adresami e-mail, ale użytkownik powinien być w stanie wybrać, które wystąpienie znaku w wierszu ma być „kotwicą”, wokół której drugi tekst jest wyśrodkowany.@
adresów jest dozwolonych w adresach e-mail, nptom"@brossmann"@example.com
. Dlatego zapytałem, co powinno się stać, jeśli jest wiele@
symboli :).@
symboli nie jest dozwolonych w różnych usługach e-mail. Całkowicie uzasadnione jest oczekiwanie, że „normalne” e-maile będą pasować do bardziej rygorystycznych standardów niż „prawdziwe”, chyba że masz do czynienia z nieprzetworzonymi, niefiltrowanymi danymi wejściowymi użytkowników, w którym to przypadku bardziej prawdopodobne jest, że poradzisz sobie z liniami bez@
.Odpowiedzi:
NIE Awk. Tylko
sed
icolumn
:Wynik:
Teraz, o czym myślę, jest to prawie to samo, co rozwiązanie Sundeep, po prostu wygląda na krótsze / ma mniej połączeń z
sed
, a także zakłada, że@
dzieje się to tylko raz na każdej linii.źródło
column -ts@ input.txt | sed -r 's/([^ ]+)( *)\s\s/\2\1@/'
W najprostszym przypadku możesz po prostu wydrukować pierwsze pole w odpowiednio dużej szerokości pola, np
AFAIK każda metoda, która nie zakłada określonej maksymalnej szerokości pola, będzie wymagała albo przechowywania pliku w pamięci, albo wykonania dwóch przejść.
źródło
cw=$(cut -d@ -f1 file | wc -L)
a następnieawk -v w="$cw" 'BEGIN{OFS=FS="@"} {$1 = sprintf("%*s", w, $1)} 1'
awk -F@ '{a[$1] = $2; w = length($1) > w? length($1) : w; next} END {for (i in a) printf("%*s%c%s\n", w, i, FS, a[i])}' INPUT-FILE.txt > OUT.txt
. Ładnie sformatował resztę, ale brakuje niektórych danych.awk -F@ '{printf "%12s@%s\n", $1, $2}' input.txt
hacky rozwiązanie, dużo zakłada tekst wejściowy
źródło
Szybkie rozwiązanie w języku Python, które wykorzystuje najkrótszą możliwą długość wypełnienia, która wyrównuje do prawej wszystkie ciągi po lewej stronie separatora:
Stosowanie:
źródło
Inne rozwiązanie GNU
awk
+column
:Wyjście:
źródło
Może to również działać z manipulacją ciągiem Bash.
Skrypt Bash (4.x):
Wynik:
źródło