Форматирование текста в столбцы


11

У меня есть файл с двумя столбцами, как показано ниже (пример):

ФАЙЛ 1:

John 1
Peter 2
Michael Rod 3
Su 7
Louise 9

Мне нужно отформатировать это, и мой ожидаемый результат должен быть:

ФАЙЛ 1:

John        1
Peter       2
Michael Rod 3
Su          7
Louise      9

1
где 2 колонки?
Марк

Оба выхода кажутся одинаковыми. Не могли бы вы дать более подробную информацию по вашему вопросу?

2
Как определяются столбцы? Есть ли вкладка или какой-либо другой символ между именем и номером? Как мы можем знать, что Michael Rod 3это 2 столбца, а не 3?
Тердон

2
Нет, не размещайте изображения текста . Я просто собирался скопировать и вставить этот текст, чтобы иметь возможность вам помочь, а теперь не могу.
Кусалананда

1
то же самое, что сказал ммминт и тердон; Вы можете указать, например, что это последний столбец, который должен иметь отступ, чтобы учесть ширину самой длинной строки?
Джефф Шаллер

Ответы:


18

Если бы на входе было только два столбца, я бы предложил использовать column -t. Это не совсем работает здесь, так как columnутилита будет обрабатывать любое количество пробелов или табуляций как разделители столбцов:

$ column -t file1
John     1      
Peter    2      
Michael  Rod  3 
Su       7      
Louise   9      

«Michael Rod» - это два столбца, так что в одной строке на один столбец больше, чем в других строках, что портит вывод.

Мы можем обойти это, вставив символ табуляции перед последним столбцом, а затем разрешив columnиспользовать (только) это в качестве разделителя:

$ awk '{ $NF = "\t" $NF; print }' file1 | column -t -s $'\t'
John          1
Peter         2
Michael Rod   3
Su            7
Louise        9

В Awk NF- количество полей (столбцов) и $NFданные в последнем поле. Используемый мной скрипт просто изменяет данные последнего поля, добавляя символ табуляции перед печатью всей строки.

Если ваша оболочка не понимает $'\t', вы можете выбрать другой символ, который не является частью данных:

awk '{ $NF = "@" $NF; print }' file1 | column -t -s '@'
John          1
Peter         2
Michael Rod   3
Su            7
Louise        9
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.