Оберните один столбец большего размера с помощью awk / bash (красивая печать) - PullRequest
0 голосов
/ 07 марта 2019

У меня такая структура таблицы (предположим, что разделители являются табуляциями):

AAA  BBBB  CCC
 01  Item  Description here
 02  Meti  A very very veeeery long description which will easily extend the recommended output width of 80 characters.
 03  Etim  Last description

То, что я хочу, это:

AAA  BBBB  CCC
 01  Item  Description here
 02  Meti  A very very veeeery
           long description which
           will easily extend the
           recommended output width
           of 80 characters.
 03  Etim  Last description

Это означает, что я хочу разделить $3в массив строк с предопределенным значением WIDTH, где первый элемент добавляется «нормально» к текущей строке, а все последующие элементы получают новую ширину строки в соответствии с отступом первых двух столбцов (заполнение также можно исправить, еслиэто проще).

В качестве альтернативы, текст в $0 может быть разделен на GLOBAL_WIDTH (например, 80 символов) на первую строку, а "rest" -> первая строка печатается "нормально" с помощью printf,остальное делится на GLOBAL_WIDTH - (COLPAD1 + COLPAD2) и добавляются новые строки ширины, как указано выше.

Я пытался работать с fmt и fold после форматирования в awk (которое в основном просто помещает заголовки в таблицу), ноони, конечно, не отражают восприятие поля awk.

Как этого добиться, используя инструменты bash и / или awk?

Ответы [ 2 ]

2 голосов
/ 07 марта 2019

Сначала создайте тестовый файл (называемый file.txt):

echo "AA  BBBB  CCC
01  Item  Description here
02  Meti  A very very veeeery long description which will easily extend the recommended output width of 80 characters.
03  Etim  Last description" > file.txt

Теперь скрипт (называемый ./split-columns.sh):

#!/bin/bash
FILE=$1

#find position of 3rd column (starting with 'CCC')
padding=`cat $FILE | head -n1 |  grep -aob 'CCC' | grep -oE '[0-9]+'`
paddingstr=`printf "%-${padding}s" ' '`

#set max length
maxcolsize=50
maxlen=$(($padding + $maxcolsize))

cat $FILE | while read line; do 
  #split the line only if it exceeds the desired length
  if [[ ${#line} -gt $maxlen ]] ; then 
    echo "$line" | fmt -s -w$maxcolsize - | head -n1
    echo "$line" | fmt -s -w$maxcolsize - | tail -n+2 | sed "s/^/$paddingstr/"
  else
    echo "$line";
  fi; 
done;

Наконец запустите его с файлом какодин аргумент

./split-columns.sh file.txt > fixed-width-file.txt

Вывод будет:

AA  BBBB  CCC
01  Item  Description here
02  Meti  A very very veeeery long description
          which will easily extend the recommended output
          width of 80 characters.
03  Etim  Last description
1 голос
/ 08 марта 2019

Вы можете попробовать Perl однострочное

perl -lpe ' s/(.{20,}?)\s/$1\n\t   /g ' file

с заданными входами

$ cat thurse.txt
AAA  BBBB  CCC
 01  Item  Description here
 02  Meti  A very very veeeery long description which will easily extend the recommended output width of 80 characters.
 03  Etim  Last description

$ perl -lpe ' s/(.{20,}?)\s/$1\n\t   /g ' thurse.txt
AAA  BBBB  CCC
 01  Item  Description
           here
 02  Meti  A very very
           veeeery long description
           which will easily extend
           the recommended output
           width of 80 characters.
 03  Etim  Last description

$

Если вы хотите попробовать с окном длины 30/40/50

$ perl -lpe ' s/(.{30,}?)\s/$1\n\t   /g ' thurse.txt
AAA  BBBB  CCC
 01  Item  Description here
 02  Meti  A very very veeeery
           long description which will easily
           extend the recommended output width
           of 80 characters.
 03  Etim  Last description

$ perl -lpe ' s/(.{40,}?)\s/$1\n\t   /g ' thurse.txt
AAA  BBBB  CCC
 01  Item  Description here
 02  Meti  A very very veeeery long description
           which will easily extend the recommended
           output width of 80 characters.
 03  Etim  Last description

$ perl -lpe ' s/(.{50,}?)\s/$1\n\t   /g ' thurse.txt
AAA  BBBB  CCC
 01  Item  Description here
 02  Meti  A very very veeeery long description which
           will easily extend the recommended output width of
           80 characters.
 03  Etim  Last description

$
...