Как я могу использовать столбец для разделения на вкладках, а не пробелы?

59

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

Я пытался указать вкладку как разделитель, используя:

cat myfile | column -t -s"\t"
черепаха
источник

Ответы:

82
column -t -s '\t'

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

column -s \tтакой же column -s t, как обратный слеш интерпретируется оболочкой как оператор цитирования.

Здесь вы хотите передать реальный символ табуляции в столбец. С помощью ksh93, zsh, bash, mksh, busybox sh или FreeBSD sh:

column -ts $'\t'

Или введите реальный символ табуляции, набрав Ctrl-V Tabв приглашении оболочки (в кавычках или перед обратной косой чертой, поскольку символ табуляции является разделителем маркеров в синтаксисе оболочки, как и пробел), или используйте "$(printf '\t')"(эти двойные кавычки, необходимые для отключения split + glob оператор в качестве символа табуляции также оказывается в значении по умолчанию $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')"

Однако см. Ниже комментарий Стефана Шазеля о том, почему это может быть непоследовательным в разных версиях оболочки.

Ник Булл
источник
2
Обратите внимание, что POSIX не определяет кодировку TAB. До сих пор существуют системы POSIX, в которых кодировка языка C основана на EBCDIC, где TAB равен 5, а не 9, как в ASCII. Там, где это возможно, лучше обращаться к символам по имени, чтобы избежать такого рода проблем, "$(printf '\t')"как показано в моем ответе. Обратите внимание, что $'...'планируется включить в следующую основную версию спецификации POSIX.
Стефан Шазелас
@ StéphaneChazelas - это $(printf '\t')POSIX? Спасибо!
Ник Булл,
3
да
Стефан Шазелас
@ StéphaneChazelas Большое спасибо, я обновил свой ответ, включив в него ваш очень полезный совет :)
Ник Булл
2

Это -tдля выбора количества столбцов, которые вы хотите. Оставление этого бланка ничего не меняет. Кроме того, вы хотите пробел после, -sтак что попробуйте это:

cat myfile | column -s \t

Lurker
источник
Благодарю. Это близко к тому, что я ищу. Однако теперь все строки объединены в одну строку. Как я могу сохранить каждую строку в отдельной строке?
черепаха
По умолчанию columnзаполняет строки перед столбцами. Вы можете быть заинтересованы вpr
Lurker