Какая команда (ы) будет кормить текстовый файл с разделителями табуляции и вырезать каждую строку до 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 Только для использования на весенних цыплятах и ​​фруктах

  • Почему вывод этой команды вставки разделяется на отдельные строки с помощью отступов?
  • Как использовать замещение процесса внутри case-case без получения синтаксических ошибок?
  • Извлечь zip-файлы в каталог на основе шаблона zip-имени
  • распечатать определенную строку из нескольких файлов
  • Shell Script - перенаправленный вывод в файл и результаты не ожидаются в первом запуске
  • bash scripting - wget или curl-файл с действием на основе состояния 200 или нет
  • Различные способы выполнения сценария оболочки
  • как удалить последнюю черту пути каталога?
  • 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 
    Interesting Posts
    Linux и Unix - лучшая ОС в мире.