Какая команда (ы) будет кормить текстовый файл с разделителями табуляции и вырезать каждую строку до 80 символов?

У меня есть текстовые файлы с несколькими строками (иногда) с разделителями табуляции. Я хотел бы вывести файл, чтобы я мог заглянуть в него, поэтому я хотел бы видеть только первые 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, на которую у меня есть доступ на этом компьютере, имеет опцию -s для сжатия нескольких символов – возможно, мне придется играть с ней больше)

Я уверен, что если бы я испортил, я мог бы использовать perl, awk или sed, или что-то в этом роде.

Тем не менее, я бы хотел, чтобы решение, которое использует (POSIX?) Регулярные команды, так что это как можно более переносимо. Если я в конечном итоге использую tr, я, вероятно, в конечном итоге попытаюсь превратить вкладки в символы, возможно, выполнить вычисления, сократить расчет и затем вернуть эти символы обратно в вкладки для вывода.

Это не обязательно должна быть одна строка / введена непосредственно в командной строке – сценарий в порядке.


Дополнительная информация о вкладках:

Я использую вкладку, чтобы разбить поля, потому что когда-нибудь мне захочется импортировать данные в какую-то другую программу. Поэтому у меня есть только одна вкладка между частями контента. Но я также использую вкладки для выравнивания объектов с вертикальными столбцами, чтобы облегчить читаемость при просмотре текстового файла. Это означает, что для некоторых фрагментов текста я помещаю конец содержимого пробелами, пока не доберусь до того места, где будет работать вкладка, выстраивая в линию следующее поле с над ними и над ним.

 DarkTurquoise # 00CED1 Море, небу, водная лодка Природа
 MediumSpringGreen # 00FA9A Полезно для деревьев Magic  
 Известь # 00FF00 Только для использования на весенних цыплятах и ​​фруктах

5 Solutions collect form web for “Какая команда (ы) будет кормить текстовый файл с разделителями табуляции и вырезать каждую строку до 80 символов?”

Я думаю, вы ищете expand и / или unexpand . Кажется, вы пытаетесь обеспечить, чтобы ширина \t ab была как 8 символов, а не одна. fold также сделает это, но он перенесет свой вклад в следующую строку, а не усекает ее. Я думаю, вы хотите:

 expand < input | cut -c -80 

expand и unexpand указаны оба POSIX :

  • Утилита expand должна записывать файлы или стандартный ввод в стандартный вывод с символами \t ab, замененными одним или несколькими символами пробела, необходимыми для перехода к следующей вкладке. Любые символы обратного пробела должны быть скопированы на выход и вызывать уменьшение декретов столбцов для вычислений остановки табуляции; счетчик столбцов не должен уменьшаться ниже нуля.

Довольно просто. Итак, вот посмотрите, что это делает:

 unset ci; set --; until [ "$((i+=1))" -gt 10 ]; do set -- "$@" "$i" "$i"; done for c in 'tr \\t \ ' expand; do eval ' { printf "%*s\t" "$@"; echo; } | tee /dev/fd/2 |'"$c"'| { tee /dev/fd/3 | wc -c >&2; } 3>&1 | tee /dev/fd/2 | cut -c -80' done 

Цикл until вершины получает набор данных, таких как …

 1 1 2 2 3 3 ... 

Он printf это с флагом padding %*s arg, поэтому для каждого из них в наборе printf будет помещаться столько же пробелов, сколько указано в аргументе. Каждому он добавляет символ \t ab.

Все tee используются для отображения эффектов каждого фильтра, когда он применяется.

И последствия следующие:

 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 66 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 105 

Эти строки выстроены в два ряда, например …

  1. вывод printf ...; echo printf ...; echo
  2. выход tr ... или expand
  3. выход cut
  4. выход wc

Лучшие четыре строки – это результаты фильтра tr в котором каждый \t ab преобразуется в одно пространство .

А нижняя четверка – результаты expand цепи.

Поскольку вкладки больше подходят для выравнивания, чем для делимитации, одним из способов может быть использование column а затем cut :

 column -s '\t' -t <some-file | cut -c -80 

Кажется, column не POSIX. Это часть BSD utils на Ubuntu, поэтому я предполагаю, что это довольно кросс-платформа.

Предложение Дон в комментариях было хорошим началом.

Это то, что мне нужно было сделать (в основном):

 pr +1 -1 -t -m -l1000 -w 80 tabfile 

-m был необходим, чтобы флаг -w вступил в силу для одного столбца. Эта страница может использовать некоторую переписку, чтобы указать это.

При попытке обходного пути я обнаружил, что pr выводит символы \t , поэтому подача результатов на cut приводит к той же проблеме.

-1 (флаг столбца), конкретно говорит на странице руководства:

Эта опция не должна использоваться с -m.

Однако без этой опции pr обрезает строки волей-неволей, намного короче указанной длины.

pr также вставляет пробел до (или после?) каждого слова в поле (т. е. у каждого места, где у меня есть одно место, есть два после обработки). Если слишком много слов, вставленные пробелы игнорируют ограничение -w (создание обертки). Но, что любопытно, в противном случае – не разделенные табуляцией (т.е. упорядоченные пробелы) столбцы остаются в очереди.

Использование awk :

 awk '{ $0 = substr($0, 1, 80) }1' file 

Основываясь на ответе Криса Дауна .

Одна утилита, которая должна быть по-настоящему осведомлена о ширине отображения, fold : к сожалению, у нее, похоже, нет возможности сбросить, а не на обертку. Хотя это, вероятно, ужасно неэффективно, вы могли бы сделать что-то вроде

 while read -r line; do fold -w80 <<< "$line" | head -n1; done < file 
  • Ошибка команды Bash
  • Двойной цикл while (BASH)
  • Каков самый быстрый способ обработки строки за строкой в ​​bash?
  • Как запустить код в фоновом режиме?
  • Как можно выполнить команду с неизвестным числом аргументов в оболочке POSIX?
  • Может ли сценарий оболочки печатать свой аргумент, цитируемый, как вы могли бы написать их в командной строке?
  • Изменение числового значения в файле с помощью Vim из сценария
  • Установка переменной со значением по умолчанию ведет себя по-другому, если перед командой?
  • Отправить javascript для Chromium или Firefox из linux terminal
  • Как использовать inotifywait для просмотра каталога для создания файлов определенного расширения
  • Измените значение в файле конфигурации или добавьте параметр, если он не существует?
  • Как я могу наблюдать за созданием определенного «триггерного файла»?
  • Interesting Posts

    возвратные строки, содержащие числа в диапазоне в определенном столбце

    вызов команды из скрипта и сохранение стиля

    Отключить аутентификацию для ssh

    Можем ли мы включить Networking в однопользовательском режиме Linux?

    Как сделать окно gnome доступным только на некоторых рабочих пространствах?

    Фильтрация изображений в соответствии с именем файла, почему?

    Какая файловая система для резервного копирования является лучшей?

    GNU parted resizeepart в скрипте

    Проблема с пониманием привязок ключей

    как я могу найти файлы на основе разных имен и удалять их все в одной строке

    Нажмите кнопку мыши 8 («браузер вперед») на кнопку мыши 2 («средний клик») на RHEL

    Текстовые файлы, содержащие свое имя

    Как смонтировать удаленный каталог sshfs на общедоступном сервере на недоступном клиентском компьютере?

    выход на проектор, так как разрешение ноутбука составляет 16: 9, а проектор ниже

    Присвоение строковой переменной из SQL-запроса переменной оболочки

    Linux и Unix - лучшая ОС в мире.