У меня есть многострочные текстовые файлы (иногда) данных, разделенных табуляцией. Я хотел бы вывести файл, чтобы я мог просмотреть его - поэтому я хотел бы видеть только первые 80 символов каждой строки (я разработал текстовый файл, чтобы поместить важные элементы в первую очередь в каждой строке).
Я думал, что смогу использовать cat, чтобы прочитать каждую строку файла и отправить каждую строку следующей команде в конвейере:
cat tabfile | cut -c -80
Но это казалось сломанным. Я попытался поиграться, и grep, похоже, сработал - но потом я обнаружил, что нет, нет (не у каждой строки в файле было более 80 символов) - кажется, что вкладки считаются как отдельные символы по разрезу.
Я старался:
cat tabfile | tr \t \040 | cut -c -80
Даже при том, что это немного испортило бы мои данные, устраняя удобство чтения пробела. Но это не сработало. Ни один не сделал:
cat tabfile | tr \011 \040 | cut -c -80
Может я неправильно использую tr? У меня раньше были проблемы с tr, когда я хотел удалить несколько пробелов (кажется, версия tr, к которой у меня есть доступ на этой машине, имеет опцию -s для сжатия нескольких символов - возможно, мне придется больше с ней играть)
Я уверен, что если бы я бездельничал, я мог бы использовать perl, awk или sed, или что-то для этого.
Тем не менее, я хотел бы, чтобы решение, которое использует (POSIX?) Обычные команды, чтобы оно было максимально переносимым. Если бы я в конечном итоге использовал tr, я, вероятно, в конце концов попытался бы превратить вкладки в символы, возможно, сделать вычисление, сократить вычисления и затем превратить эти символы обратно во вкладки для вывода.
Это не должно быть одной строкой / вводится непосредственно в командной строке - сценарий в порядке.
Больше информации о tab-файлах:
Я использую tab для разбиения полей, потому что когда-нибудь я захочу импортировать данные в какую-то другую программу. Поэтому я склонен иметь только одну вкладку между частями контента. Но я также использую вкладки, чтобы выровнять вещи по вертикальным столбцам, чтобы улучшить читаемость при просмотре простого текстового файла. Это означает, что для некоторых фрагментов текста я закрываю конец содержимого пробелами, пока не доберусь до места, где будет работать вкладка, выравнивая следующее поле с полями выше и ниже.
DarkTurquoise # 00CED1 Море, Небо, Гребные лодки Природа MediumSpringGreen # 00FA9A Полезно для деревьев Магия Лайм № 00FF00 Только для использования на весенних цыплятах и фруктах
источник
pr
сcoreutils
:pr -1 -t -l200 -W80 file
. Увеличьте / уменьшите длину страницы (число после-l
) в соответствии с вашими потребностями.Ответы:
Я думаю, что вы ищете
expand
и / илиunexpand
. Кажется, вы пытаетесь убедиться, что\t
ширина аб считается 8 символов, а не один.fold
будет делать то же самое, но будет переносить свои данные на следующую строку, а не обрезать их. Я думаю, что вы хотите:expand
иunexpand
оба определены POSIX :expand
Утилита должна записывать файлы или стандартный ввод на стандартный вывод с\t
символами аб заменен один или несколько космических символами , необходимых для прокладки к следующей позиции табуляции. Любые символы возврата должны быть скопированы в выходной файл, что приведет к уменьшению числа позиций столбца для расчетов табуляции; количество позиций столбца не должно быть уменьшено ниже нуля.Довольно просто Итак, вот посмотрим, что это делает:
until
Петля на вершине получает набор данных , такие как ...Это происходит
printf
с помощью%*s
флага заполнения аргументов, поэтому для каждого из набораprintf
будет заполнено столько пробелов, сколько содержится в числе аргументов. К каждому из них добавляется\t
символ ab.Все из
tee
них используются, чтобы показать эффекты каждого фильтра, как он применяется.И эффекты таковы:
Эти ряды выстроены в два набора, как ...
printf ...; echo
tr ...
илиexpand
cut
wc
Верхние четыре строки - это результаты
tr
фильтра, в котором каждый\t
ab конвертируется в один пробел .И в нижней четверке результаты
expand
цепочки.источник
Поскольку вкладки предназначены скорее для выравнивания, чем для разграничения, одним из способов может быть использование,
column
а затемcut
:Кажется,
column
это не POSIX. Это часть утилит BSD в Ubuntu, поэтому я предполагаю, что это довольно кроссплатформенная.источник
column
таком способе OP даже не потребуется вручную добавлять пробелы для выравнивания.Предложение Дона в комментариях было хорошим началом.
Вот что мне нужно, чтобы это (в основном) работало:
-m
Было необходимо , чтобы сделать-w
флаг вступает в силу на один столбец. Страница справочника может использовать некоторую переписку, чтобы указать это.При попытке обойти, я обнаружил, что
pr
выводятся\t
символы, поэтому подача его результатов приводит кcut
той же проблеме.-1
(флаг столбца) специально говорит на странице руководства:Однако без этой опции
pr
обрезает линии волей-неволей, намного короче указанной длины.pr
также вставляет пробел перед (или после?) каждым словом в поле (т. е. каждое место, где у меня есть один пробел, имеет два после обработки). Если слов слишком много, вставленные пробелы игнорируют-w
ограничение (создание переноса). Но, что любопытно, в противном случае «не разделенные табуляцией» (т. Е. Расставленные пробелы) «столбцы» остаются выровненными.источник
Использование
awk
:На основании ответа Криса Дауна здесь .
источник
Одна утилита, которая должна быть полностью осведомлена о ширине экрана
fold
: к сожалению, у нее, похоже, нет возможности отбрасывать вместо переноса. Хотя это, вероятно, ужасно неэффективно, вы можете сделать что-то вродеисточник