выравнивание по правому краю / номера колод в bash - PullRequest
22 голосов
/ 15 июня 2009

Какой способ ввода чисел лучше всего печатать при выводе в bash, чтобы числа были выровнены по экрану вправо. Итак, это:

00364.txt with 28 words in 0m0.927s
00366.txt with 105 words in 0m2.422s
00367.txt with 168 words in 0m3.292s
00368.txt with 1515 words in 0m27.238

Должно быть напечатано так:

00364.txt with   28 words in 0m0.927s
00366.txt with  105 words in 0m2.422s
00367.txt with  168 words in 0m3.292s
00368.txt with 1515 words in 0m27.238

Я печатаю их построчно из цикла for. И я буду знать верхнюю границу количества слов в файле (только не сейчас).

Ответы [ 4 ]

35 голосов
/ 15 июня 2009

Для bash используйте команду printf с флагами выравнивания.

Например:

 printf '%7s' 'hello'

Печать:

   hello

(Вообразите там 2 пробела)

Теперь используйте ваше усмотрение для вашей проблемы.

22 голосов
/ 15 июня 2009

Вот немного более понятный пример:

#!/bin/bash
for i in 21 137 1517
do
    printf "...%5d ...\n" "$i"
done

Производит:

...   21 ...
...  137 ...
... 1517 ...
9 голосов
/ 01 октября 2014

Если вы заинтересованы в динамическом изменении ширины, вы можете использовать функцию printf '% * s'

printf '%*s' 20 hello

который печатает

               hello
3 голосов
/ 28 апреля 2016

Ниже приведена комбинация ответов, которая удаляет жестко запрограммированную строку длиной 5 символов:

VALUES=( 21 137 1517 2121567251672561 )
MAX=1

# Calculate the length of the longest item in VALUES
for i in "${VALUES[@]}"; do
  [ ${#i} -gt ${MAX} ] && MAX=${#i}
done

for i in "${VALUES[@]}"; do
  printf "... %*s ...\n" $MAX "$i"
done

Результат:

...               21 ...
...              137 ...
...             1517 ...
... 2121567251672561 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...