Как обнулить последовательность целых чисел в bash, чтобы все они имели одинаковую ширину? - PullRequest
355 голосов
/ 09 января 2012

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

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

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

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

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

Ответы [ 12 ]

592 голосов
/ 09 января 2012

В вашем конкретном случае, вероятно, проще всего использовать флаг -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 -v j "%05d" $i
$ echo $j
00099

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

115 голосов
/ 20 июля 2013

Проще еще можно просто сделать

for i in {00001..99999}; do
  echo $i
done
76 голосов
/ 12 декабря 2014

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

seq -w 1 10

производят

01
02
03
04
05
06
07
08
09
10
69 голосов
/ 09 января 2012

использовать printf с "% 05d", например

printf "%05d" 1
17 голосов
/ 09 января 2012

Очень просто, используя printf

[jaypal:~/Temp] printf "%05d\n" 1
00001
[jaypal:~/Temp] printf "%05d\n" 2
00002
12 голосов
/ 09 января 2012

Используйте 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.

8 голосов
/ 01 марта 2016

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

for i in $(seq 1 10)
do
RESULT=$(echo 00000$i | tail -c 6)
echo $RESULT
done
4 голосов
/ 26 декабря 2016

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

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

Вывод:

01
02
03
04
05
1 голос
/ 17 октября 2018

Другой способ:

zeroos="000"
echo 

for num in {99..105};do
 echo ${zeroos:${#num}:${#zeroos}}${num}
done

Такая простая функция для преобразования любого числа будет:

function leading_zero(){

    local num=$1
    local zeroos=00000
    echo ${zeroos:${#num}:${#zeroos}}${num} 

}
1 голос
/ 31 августа 2018

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

for i in {0..9}{0..9}{0..9}{0..9}
do
  echo "$i"
done
...