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

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

Есть текстовый файл, 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 сделать это?

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

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

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, которые поддерживают многобайтовые символы, это не сработает правильно, если ввод содержит символы нулевой ширины или двойной ширины.

Это работает в awk:

$ awk '{ printf "%-10s %s\n", $1, $2 }' file.txt
abc        01245
def-1      32154
ghi-3      55432
jkl        44121
mno-4      23147
pqr        897044

-10s добавляет отступ из 10 пробелов в начале первого напечатанного поля, так что любое значение, меньшее десяти символов, будет дополнено до десяти символов.

Используя perl: как предложил @Stéphane Chazelas

$ perl -lane 'printf "%-10s %s\n", @F'

Если файл содержит только два поля, можно использовать следующую команду, но это будет работать только в том случае, если первое поле имеет длину 9 символов.

$ perl -lane 'print($F[0], " " x (10-length($F[0])),$F[1])'

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

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

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

Проблема

Вы имеете текстовый файл, содержащий данные в формате:

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:

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

Объяснение:

  • printf позволяет вам задавать формат вывода. Здесь %-10s означает, что первое слово будет занимать 10 символов с выравниванием по левому краю, оставляя место для пробелов, если это слово короче 10 символов.
  • %s используется для вывода второго слова без дополнительного форматирования.

Альтернативные способы

  1. Использование tr и expand для табуляции:

Если вы хотите выровнять текст с помощью табуляции, вы можете заменить пробелы на символы табуляции. Например:

tr ' ' '\t' < file.txt | expand -t10
  • tr ' ' '\t' заменяет пробелы на табуляцию.
  • expand -t10 заменяет табуляции на пробелы, установленные через каждый 10-й символ.
  1. Использование команды column:

Команда column позволяет легко выравнивать текст. Например:

column -t -o ' ' file.txt
  • -t указывает на необходимость выравнивания по столбцам.
  • -o ' ' задает пробелы между колонками.
  1. Использование perl:

Если вы предпочитаете использовать perl, вы можете сделать это следующим образом:

perl -lane 'printf "%-10s %s\n", @F' file.txt
  • Этот код использует @F для доступа к колонкам и форматирует их аналогично примеру с awk.

Заключение

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

Внедрение этих команд в ваш рабочий процесс позволит эффективно управлять текстовой информацией и обеспечит её удобочитаемость.

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

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