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

Синтаксис rsyncSRC DEST очень похож на синтаксис cpSRC DEST, поэтому вы можете использовать что-то вроде

rsync -auv */*.{txt,doc} /home/joedoe/Books/

, чтобы скопировать все файлы *.txt и *.doc в целевой каталог.

Опции:

  • -aрежим архива (ярлык для-rlptgoD)
  • -uпропускать более новые файлы на приемнике (, напримерcp -u)
  • -vувеличить детализацию

Поскольку опция архивирования -aтакже включает рекурсивную опцию -r, вы можете отключить этот флаг с помощью дополнительной --no-rесли вы хотите,(-aтакже скопирует каталог Book/my.doc/, поскольку он будет соответствовать шаблону *.docи -a --no-rотключит рекурсию ).

Вывод с --dry-runбудет выглядеть следующим образом:

$ rsync --dry-run -auv */*.{txt,doc} /home/joedoe/Books/
sending incremental file list
created directory /home/joedoe/Books
Temp2.txt
Temp3.doc
Temp5.txt
Temp6.doc

sent 221 bytes  received 69 bytes  580.00 bytes/sec
total size is 11  speedup is 0.04 (DRY RUN)

Вы можете добавить несколько аргументов -v, чтобы получить более подробный вывод, например -vvили -vvv.

0
01.12.2020, 15:29
2 ответа

Сawk:

awk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}' < input > output

Правильное заполнение пробелов и усечение.

В зависимости от awkреализации это будет длина в байтах или символах (, которая будет иметь значение для многобайтовых -символов ). В любом случае, не на основе ширины отображения этих символов (, например, для символов двойной ширины -или ширины 0 -или TAB, которые не имеют ширины отображения 1 на терминалах ).

Примеры:

$ echo 'A|B|C|D' | awk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}'
AB  C   D

(каждая из этихABCDграфем состоит из одного символа, каждая состоит из одного байта в любой локали и имеет одинарную -ширину ).

$ echo 'A|B|Ç|D' | gawk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}'
AB  Ç   D
$ echo 'A|B|Ç|D' | mawk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}'
AB  Ç  D

(2 байта, 1 -ширина Çсимвол в UTF -8)

$ echo $'A|B|C\u0327|D' | gawk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}'
AB  Ç  D
$ echo $'A|B|C\u0327|D' | mawk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}'
AB  Ç D

1 -байт,1 -ширина Cв сочетании с 0 -шириной, 2 байта (в UTF -8 )объединение седилл для формирования 1 -ширины, 2 -символов, 3 -] байт Çграфема, разложенная версия предварительно -составленного символа U+00C7 Çв предыдущем примере.

Чтобы принять во внимание отображаемую ширину символов, с некоторыми expandреализациями (, хотя и не GNU expand), и предполагая, что ввод не содержит символов TAB, и ни одно из полей ввода не превышает их выделенную ширину в первое место, вы могли бы сделать:

<input sed $'s/|/|\t/g;s/$/|\t/' | expand -t3,8,14,22 | sed 's/| //g' >output

Что на выходе printf '%s\n' 'A|B|C|D' $'A|B|\uc7|D' $'A|B|C\u327|D'должно дать:

AB  C   D
AB  Ç   D
AB  Ç   D
6
18.03.2021, 22:46

Использование только bashфункциональности оболочки...

Для предоставленных данных выборки:

$ foo="A|B|C|D"; printf "%s%s  %s   %s     \n" $(echo -e "${foo//|/ }" )
AB  C   D     

$ foo="A|B|C\u0327|D"; printf "%s%s  %s   %s     \n" $(echo -e "${foo//|/ }" )
AB  Ç   D     

Для фиксированного вывода поля для каждого вопроса при условии, что ни одно из полей ввода не превышает максимальную указанную ширину:

$ foo="A|B|C|D"; printf "%-1.1s%-3.3s%-4.4s%-6.6s\n" $(echo -e "${foo//|/ }" )
AB  C   D     

Для многобайтовых символов, таких как , возникает проблема, заключающаяся в том, что спецификатор ширины вprintf(как встроенной bashоболочке, так и автономной утилите )считает байты, а не многобайтовые символы. Таким образом, вы можете получить «неожиданный» вывод.

$ foo="A|B|\uc7|D"; /bin/printf "%-1.1s%-3.3s%-4.4s%-6.6s\n" $(echo -e  "${foo//|/ }" )
AB  Ç  D    

$ foo="A|B|\uc7|D"; /bin/printf "%-1.1s%-3.3s%-4.4s%-6.6s\n" $(echo -e  "${foo//|/ }" ) | xxd
00000000: 4142 2020 c387 2020 4420 2020 2020 0a    AB ..  D    .
$ 
 
-1
18.03.2021, 22:46

Теги

Похожие вопросы