Як можна використовувати стовпчик для розмежування на вкладках, а не пробілах?


59

Я хотів би скористатися командою Unix columnдля форматування тексту. У мене поля, розділені вкладками, але всередині кожного поля також є пробіли. columnрозмежування на пробілі (вкладки та пробіли). Як я можу зробити так, щоб стовпець використовував лише вкладки як роздільник?

Я намагався вказати вкладку як роздільник, використовуючи:

cat myfile | column -t -s"\t"

Відповіді:


82
column -t -s '\t'

буде розділяти стовпці \та tсимволи.

column -s \tце те саме column -s t, що зворотна косою рискою інтерпретується як оператор котирування.

Тут ви хочете передати справжній символ TAB до стовпця. З ksh93, zsh, bash, mksh, busybox sh або FreeBSD sh:

column -ts $'\t'

Або введіть справжній символ вкладки, ввівши Ctrl-V Tabпідказку оболонки (в лапках або передуючи зворотній косої риси, оскільки символ вкладки є роздільником токенів у синтаксисі оболонки так само, як пробіл), або використовуйте "$(printf '\t')"(ці подвійні лапки, необхідні для відключення розділення + глобул Оператор як символ вкладки також буває у значенні за замовчуванням $IFS).


3
Я повинен був зробити так, column -t -s $'\t'як баш, здавалося, думав, '\t'означає і те, \ і t, але $'\t'означає буквальну вкладку. Баш смердить
ThorSummoner

Якщо вам потрібна POSIX-відповідність (лорд, допоможіть мені), будь ласка, дивіться мою відповідь, яка ґрунтується на цій фантастичній відповіді!
Нік Булл

Це рішення працювало для мене - $'\t'вкладка робить роздільник. Але я майже впевнений, що я awk -F "\t"використовую вкладку як роздільник для awk. Чому це працює, а не тут для стовпчика?
Майк

3

Я використовував таке (працює лише у тому випадку, якщо ваш текст не містить |):

cat myfile | tr '\t' '|' | column -t -s '|'

Це просто замінює вкладки трубами, а потім використовує стовпчик з трубами як роздільники.

(Я зробив це, тому що я нічого не бачив у відповіді Стефана, який би вийшов з коробки в рибній оболонці. Інакше відповідь Стефана здається гарною.)


3

Для POSIX, $'...'як відомо, що проходить ANSI-C, не визначено.

Натомість ви можете використовувати $(printf '\t'):

column -t -s "$(printf '\t')"

$(printf '\011')може бути використаний, оскільки 011(восьмеричне подання десяткової 9) є кодом ANSI для символу горизонтальної вкладки:

column -t -s "$(printf '\011')"

Однак дивіться коментар Stéphane Chazelas нижче про те, чому це може бути невідповідним для оболонок версій.


2
Зауважте, що POSIX не визначає, що таке кодування TAB. Є ще POSIX-системи, кодування яких у локальному середовищі C базується на EBCDIC, де TAB дорівнює 5, а не 9, як у ASCII. Де це можливо, краще посилатися на символи по імені, щоб уникнути подібних питань, як, "$(printf '\t')"як показано в моїй відповіді. Зауважте, що $'...'планується включити до наступної основної версії специфікації POSIX.
Стефан Шазелас

@ StéphaneChazelas - це $(printf '\t')POSIX? Дякую!
Нік Булл


@ StéphaneChazelas Дякую вам велике, я оновив свою відповідь, щоб включити вашу дуже корисну пораду :)
Nick Bull

2

Значення -tдля вибору потрібної кількості стовпців. Залишаючи це порожнім, нічого не змінюється. Крім того, ви хочете пробілити після -sцього, спробуйте це:

cat myfile | column -s \t


Дякую. Це близько до того, що я шукаю. Однак тепер всі рядки об'єднуються в одну лінію. Як я можу тримати кожен рядок у своїй лінії?
черепаха

За замовчуванням columnзаповнює рядки перед стовпцями. Можливо, вас зацікавитьpr
lurker
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.