Выравнивание пробелом разделённых слов по столбцам

Вопрос или проблема

Есть текстовый файл, file.txt. В нем:

abc 01245
def-1 32154
ghi-3 55432
jkl 44121
mno-4 23147
pqr 897044
....

Как отформатировать это в вывод, подобный этому:

abc   01245
def-1 32154
ghi-3 55432
jkl   44121
mno-4 23147
pqr   897044
....

Может ли awk сделать это?

правка:

Я сам нашел ответ:

awk '{ printf "%-10s %s\n", $1, $2 }' file.txt

работает для меня.

с awk '{ printf "%-10s %s\n", $1, $2 }' file.txt это работает!

Чтобы выровнять столбцы текста, помимо добавления пробелов к полям до определенной длины символов¹ с помощью awk‘s printf, как вы нашли, есть несколько альтернатив:

Вы можете заменить пробел на символ горизонтальной табуляции и позволить вашему терминалу выровнять текст:

tr ' ' '\t' < file

По умолчанию, точки табуляции на терминалах обычно расположены через 8 столбцов, но вы можете изменить это с помощью команды tabs, или вы можете передать этот вывод в команду expand, чтобы вернуть символы TAB в правильное количество пробелов:

tr ' ' '\t' < file | expand -t10

Например, для табуляций через 10 столбцов вместо 8.

Если вы заранее не знаете максимальную ширину столбцов, вы также можете использовать команду BSD column:

column -t < file

Она разделяет столбцы двумя пробелами, но вы можете добавить -o ' ', чтобы использовать один пробел вместо этого.

Или, предполагая, что все строки имеют ровно два поля, с помощью BSD rs:

rs -z 0 2 < file

Снова с двумя пробелами между столбцами, но количество пробелов можно изменить с помощью опции -g (rs -zg1 0 2, например, для одного пробела).

По крайней мере, на Debian я обнаружил, что все это по-прежнему работает нормально, если ввод содержит символы с многобайтовой кодировкой или символы с нулевой шириной или двойной шириной.


¹ или байт в зависимости от реализации awk; в любом случае, даже с теми реализациями awk, которые поддерживают многобайтовые символы, это не будет работать должным образом, если ввод содержит символы с нулевой шириной или двойной шириной.

Ответ или решение

Выровнять столбцы текста в файле с пробелами

Если у вас есть текстовый файл, например file.txt, содержимое которого вы хотите красиво вывести в столбцы, вы можете использовать инструменты командной строки, такие как awk, tr, column или другие, чтобы достичь желаемого формата. Давайте рассмотрим несколько методов, которые помогут вам выровнять столбцы текстовых данных.

Пример содержимого файла

Предположим, что ваш файл имеет следующее содержимое:

abc 01245
def-1 32154
ghi-3 55432
jkl 44121
mno-4 23147
pqr 897044

Метод 1: Использование awk

Самый простой и эффективный способ — это использование команды awk. Как вы уже обнаружили, следующая команда позволяет выровнять текст:

awk '{ printf "%-10s %s\n", $1, $2 }' file.txt

Объяснение команды:

  • awk обрабатывает файл построчно.
  • printf используется для форматированного вывода.
  • %-10s означает, что первое поле ($1) будет занимать 10 символов с выравниванием по левому краю. Если символов меньше 10, пробелы будут добавлены справа.
  • %s для второго поля ($2) выводится без дополнительного форматирования.

Метод 2: Использование tr для замены пробелов на табуляцию

Вы также можете заменить пробелы на символы табуляции, что позволит терминалу самостоятельно выровнять текст:

tr ' ' '\t' < file.txt

Этот метод использует команду tr для замены пробелов на табуляцию, что может привести к более аккуратному выравниванию в зависимости от настроек табуляции терминала. Если по умолчанию табуляция равна 8, вы можете изменить её с помощью команды tabs или использовать expand:

tr ' ' '\t' < file.txt | expand -t10

Это позволяет задать ширину табуляции в 10 символов.

Метод 3: Использование команды column

Команда column является очень мощным инструментом для форматирования текста в столбцы:

column -t < file.txt

Эта команда разделяет данные на колонки и выравнивает их. Вы можете использовать флаг -o ' ' для установки однобайтового разделителя, если это необходимо:

column -t -o ' ' < file.txt

Метод 4: Использование команды rs

Если в вашем файле точно две колонки, вы можете использовать команду rs:

rs -z 0 2 < file.txt

Это также обеспечит выравнивание, при этом вы можете настроить количество пробелов между колонками с помощью опции -g.

Заключение

Выровнять текст в столбцы — это задача, которую можно решить многими способами с использованием командной строки.Каждый из методов имеет свои достоинства и недостатки, поэтому выбор подходящего метода зависит от конкретных требований и обстоятельств.

Для максимального эффекта и читабельности текста выбирайте тот метод, который лучше всего подходит для ваших нужд. Все предложенные команды работают в большинстве дистрибутивов Linux и будут совместимы с текстами, содержащими многобайтовые символы.

Используйте эти подходы для преобразования данных, и ваш текст станет более структурированным и легким для восприятия.

Оцените материал
Добавить комментарий

Капча загружается...