column
Выровнять текст в таблицу, задать заголовки, переставить и спрятать столбцы, вывести JSON
column из пакета util-linux делает из «рваного» текста ровную таблицу: с -t разбивает строки на поля и выравнивает их по ширине самого длинного значения. Без -t раскладывает список в несколько колонок, как ls. Удобен в конце конвейера: mount | column -t, … | column -t -s, для CSV.
Синтаксис
column -t [опции] [файл…] # таблица
column [-c ширина] [-x] [файл…] # список в несколько колонок
Без файлов читает стандартный ввод.
Опции
Режим таблицы
| Опция | Что делает |
|---|---|
-t | построить таблицу: разбить строки на поля и выровнять столбцы |
-s СИМВОЛЫ | разделители полей на входе (любой из символов). По умолчанию — пробелы и табуляции, идущие подряд считаются одним разделителем |
-o СТРОКА | разделитель столбцов на выходе (по умолчанию два пробела), например -o ' | ' |
-l N | не больше N столбцов: всё, что дальше, остаётся в последнем столбце как есть |
-L | сохранять пустые строки (по умолчанию выбрасываются) |
Заголовки и столбцы
Опции ниже работают с -t и ссылаются на столбцы по имени из -N или по номеру с 1.
| Опция | Что делает |
|---|---|
-N имя1,имя2,… | задать имена столбцов и напечатать их строкой-заголовком |
-d | не печатать заголовок (имена из -N нужны только чтобы ссылаться на столбцы) |
-R столбцы | выровнять эти столбцы по правому краю — удобно для чисел |
-H столбцы | спрятать эти столбцы |
-O столбцы | порядок вывода столбцов, например -O C,A |
-T столбцы | обрезать текст в этих столбцах, если не влезает в ширину |
-W столбцы | переносить текст в этих столбцах, если не влезает |
-E столбцы | не учитывать слишком длинные значения этих столбцов при расчёте ширины |
-J | вывести таблицу как JSON: массив объектов с ключами из -N |
-n имя | имя массива в JSON (по умолчанию table) |
Режим списка (без -t)
| Опция | Что делает |
|---|---|
-c ШИРИНА | ширина вывода в символах (по умолчанию — ширина терминала, в конвейере 80) |
-x | заполнять сначала строки, потом колонки (по умолчанию — сначала колонки) |
Примеры
printf 'name age city\nalice 30 Moscow\nbob 4 Tver\n' > people.txt
# ровная таблица
column -t people.txt
# CSV: разделитель — запятая, пустые поля сохраняются
printf 'a,b,c\n1,,3\n' | column -t -s,
# свой разделитель на выходе
printf 'a:b\n11:2\n' | column -t -s: -o ' | '
# добавить заголовок и выровнять числа вправо
printf 'x 1\nyyyy 1000\n' | column -t -N name,size -R size
# переставить и спрятать столбцы
printf '1 2 3\n4 5 6\n' | column -t -N A,B,C -O C,A -H B
# в JSON
printf 'x 1\ny 2\n' | column -t -N name,n -J -n items
# первые два поля — столбцы, остаток строки — как есть
printf 'id 1 some long text\nid 22 short\n' | column -t -l 3
# список в колонки
seq 12 | column -c 30
seq 12 | column -c 30 -x
# /etc/passwd — читаемо
column -t -s: /etc/passwd | head -n 3
Подводные камни
- Кириллица в локали
Cпревращается в\xd0\xb8…. В песочнице локаль по умолчаниюC, иcolumnэкранирует все не-ASCII байты. Запускай сLC_ALL=C.UTF-8 column -t— тогда и текст, и ширина столбцов будут правильными. - С
-sкаждый разделитель значим. Без-sнесколько пробелов подряд — один разделитель. С-s ' 'два пробела подряд дают пустой столбец, и таблица съезжает. Для текста, выровненного пробелами,-sне указывай. - Кавычки CSV не понимаются.
a,"b,c",dс-s,разобьётся на четыре поля:a,"b,c",d. Для CSV с кавычками нужен настоящий парсер, например модульcsvв python3. - Пустые строки по умолчанию выбрасываются. Если они нужны как разделители блоков, добавь
-L. -Nне берёт заголовок из файла, а добавляет новый. Если первая строка ввода уже заголовок,-Nне нужен — она выровняется вместе с данными. А если имена нужны для-Rили-H, отрежь старый заголовок (tail -n +2) и передай те же имена в-N.- Режим списка использует табуляции для выравнивания: при копировании в другие программы колонки могут «поехать».
- Это
columnиз util-linux 2.39. В BSD-версии (macOS) и в старых util-linux нет многих опций режима таблицы (-N,-R,-Jи других), так что рецепты отсюда там могут не работать.