Вопрос или проблема
Есть текстовый файл, 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
используется для вывода второго слова без дополнительного форматирования.
Альтернативные способы
- Использование
tr
иexpand
для табуляции:
Если вы хотите выровнять текст с помощью табуляции, вы можете заменить пробелы на символы табуляции. Например:
tr ' ' '\t' < file.txt | expand -t10
tr ' ' '\t'
заменяет пробелы на табуляцию.expand -t10
заменяет табуляции на пробелы, установленные через каждый 10-й символ.
- Использование команды
column
:
Команда column
позволяет легко выравнивать текст. Например:
column -t -o ' ' file.txt
-t
указывает на необходимость выравнивания по столбцам.-o ' '
задает пробелы между колонками.
- Использование
perl
:
Если вы предпочитаете использовать perl
, вы можете сделать это следующим образом:
perl -lane 'printf "%-10s %s\n", @F' file.txt
- Этот код использует
@F
для доступа к колонкам и форматирует их аналогично примеру сawk
.
Заключение
Таким образом, вы можете использовать разные утилиты для достижения вашей цели выравнивания столбцов в текстовом файле. awk
является одним из самых универсальных и мощных инструментов для этого, однако альтернативные методы, такие как column
, tr
и perl
, также предоставляют гибкие возможности для форматирования вывода. Выбор конкретного метода будет зависеть от ваших предпочтений и требований к формату данных.
Внедрение этих команд в ваш рабочий процесс позволит эффективно управлять текстовой информацией и обеспечит её удобочитаемость.