Есть ли команда или набор команд, которые я могу использовать для горизонтального выравнивания строк текста по произвольному символу? Например, со списком адресов электронной почты в результате будет получен текстовый файл со всеми символами «@», выстроенными вертикально.
Чтобы быть успешным, я считаю, что переменное количество пустых мест должно быть добавлено в начало большинства строк. Я не хочу отдельных столбцов, поскольку они требуют больше усилий для чтения (например,column -t -s "@" < file.txt
).
Перед:
123@example.com
456789@example.net
01234@something-else.com
После:
123@example.com
456789@example.net
01234@something-else.com
Другими словами: могу ли я указать символ как опорную точку, вокруг которой окружающий текст горизонтально центрирован? Мой вариант использования для этого - адреса электронной почты, чтобы их было проще сканировать визуально.
text-processing
command-line
Том Броссман
источник
источник
@
символов?@
символы не должны быть проблемой с адресами электронной почты, но пользователь должен иметь возможность выбрать, какой экземпляр символа в строке будет «якорем», вокруг которого центрируется другой текст.@
адресах электронной почты допускается несколько символов, напримерtom"@brossmann"@example.com
. Вот почему я спросил, что должно произойти, если есть несколько@
символов :).@
символов не допускаются в различных почтовых службах. Вполне разумно ожидать, что «нормальные» электронные письма соответствуют более строгим стандартам, чем «реальные», если вы не имеете дело с необработанным, нефильтрованным пользовательским вводом, и в этом случае вы, скорее всего, будете иметь дело со строками без@
.Ответы:
НЕТ Awk. Только
sed
иcolumn
:Выход:
Теперь, о чем я думаю, это почти то же самое, что и решение Sundeep, оно выглядит короче / имеет меньше вызовов
sed
, и также предполагает, что это@
происходит только один раз в каждой строке.источник
column -ts@ input.txt | sed -r 's/([^ ]+)( *)\s\s/\2\1@/'
В простейшем случае вы можете просто напечатать первое поле в достаточно большой ширине поля, например
AFAIK любой метод, который не предполагает конкретной максимальной ширины поля, потребует либо удержания файла в памяти, либо выполнения двух проходов.
источник
cw=$(cut -d@ -f1 file | wc -L)
а затемawk -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
. Это действительно форматировало остаток хорошо, но некоторые данные отсутствуют.awk -F@ '{printf "%12s@%s\n", $1, $2}' input.txt
хакерское решение, много предполагает ввод текста
источник
Быстрое решение Python, которое использует минимально возможную длину заполнения, выравнивая по правому краю все строки слева от разделителя:
Использование:
источник
Другое решение GNU
awk
+column
:Выход:
источник
Это может работать и с манипуляциями с Bash.
Скрипт Bash (4.x):
Результат:
источник