Вопрос или проблема
Есть текстовый файл, 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 и будут совместимы с текстами, содержащими многобайтовые символы.
Используйте эти подходы для преобразования данных, и ваш текст станет более структурированным и легким для восприятия.