Как обнулить последовательность целых чисел в bash, чтобы все имели одинаковую ширину?

Мне нужно зацикливать некоторые значения,

for i in $(seq $first $last) do does something here done 

Для $first и $last , мне нужно, чтобы она имела фиксированную длину 5. Итак, если входной файл равен 1 , мне нужно добавить нули спереди, чтобы он стал 00001 . Например, он работает до 99999 , но длина должна быть 5.

Например: 00002 , 00042 , 00212 , 012312 и т. Д.

Любая идея о том, как я могу это сделать?

    В вашем конкретном случае, хотя, вероятно, проще всего использовать флаг -f для seq чтобы заставить его форматировать числа, когда он выводит список. Например:

     for i in $(seq -f "%05g" 10 15) do echo $i done 

    будет производить следующий результат:

     00010 00011 00012 00013 00014 00015 

    В общем случае bash имеет printf как встроенный, поэтому вы можете выводить вывод с нулями следующим образом:

     $ i=99 $ printf "%05d\n" $i 00099 

    Вы можете использовать флаг -v для хранения вывода в другой переменной:

     $ i=99 $ printf -vj "%05d" $i $ echo $j 00099 

    Обратите внимание, что printf поддерживает несколько иной формат для seq поэтому вам нужно использовать %05d вместо %05g .

    Легче еще вы можете просто сделать

     for i in {00001..99999}; do echo $i done 

    используйте printf с «% 05d», например

     printf "%05d" 1 

    Если конец последовательности имеет максимальную длину заполнения (например, если вы хотите, чтобы 5 цифр и команда были «seq 1 10000»), вы можете использовать флаг «-w» для seq – он добавляет саму по себе.

     seq -w 1 10 

    производить

     01 02 03 04 05 06 07 08 09 10 

    Очень просто использовать printf

     [jaypal:~/Temp] printf "%05d\n" 1 00001 [jaypal:~/Temp] printf "%05d\n" 2 00002 

    Используйте awk следующим образом:

     awk -v start=1 -v end=10 'BEGIN{for (i=start; i<=end; i++) printf("%05d\n", i)}' 

    ВЫВОД:

     00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 

    Обновить:

    Как альтернатива чистого bash вы можете сделать это, чтобы получить тот же результат:

     for i in {1..10} do printf "%05d\n" $i done 

    Таким образом, вы можете избежать использования внешней программы seq которая НЕ доступна во всех вариантах * nix.

    Я набираю вывод с большим количеством цифр (нhive), чем мне нужно, затем используйте хвост, чтобы использовать только количество цифр, которые я ищу. Обратите внимание, что вы должны использовать «6» в хвосте, чтобы получить последние пять цифр 🙂

     for i in $(seq 1 10) do RESULT=$(echo 00000$i | tail -c 6) echo $RESULT done 

    Если вы хотите N цифр, добавьте 10 ^ N и удалите первую цифру.

     for (( num=100; num<=105; num++ )) do echo ${num:1:3} done 

    Вывод:

     01 02 03 04 05 

    Это также будет работать:

     for i in {0..9}{0..9}{0..9}{0..9} do echo "$i" done 
    Давайте будем гением компьютера.